並發控製
三角洲湖提供ACID事務讀寫之間的擔保。這意味著:
多個作家跨多個集群可以同時修改一個表分區和看到一致的快照視圖的表,將會有一個串行順序對這些寫道。
讀者繼續看到一致的快照視圖的表數據磚工作開始的,即使在工作表被修改。
樂觀並發控製
三角洲湖使用樂觀並發控製提供交易擔保之間寫道。在這種機製下,寫操作分三個階段:
讀:讀取(如果需要的話)的最新版本表來確定哪些文件需要修改(重寫)。
寫:階段所有的變化通過編寫新的數據文件。
驗證並提交:在提交更改之前,檢查是否擬議中的衝突與其他任何變化可能是同時提交自讀的快照。如果沒有衝突,所有更改提交新版本快照,和寫操作成功。然而,如果有衝突,寫操作失敗與並發修改異常而不是腐蝕表與寫操作會發生在鋪桌子。
表的隔離級別定義事務的程度必須從修改由孤立的並發操作。對信息隔離級別由三角洲湖在磚上,看到的隔離級別。
寫衝突
下表描述了對寫操作可以在每一個衝突隔離級別。
插入 |
更新、刪除、合並 |
優化 |
|
---|---|---|---|
插入 |
不衝突 |
||
更新、刪除、合並 |
可以在可序列化的衝突,不能衝突WriteSerializable如果寫入表沒有先閱讀嗎 |
能在序列化和WriteSerializable衝突 |
|
優化 |
不衝突 |
能在序列化和WriteSerializable衝突 |
能在序列化和WriteSerializable衝突 |
避免使用分區和不相交的命令衝突的條件
在所有情況下都標記為“衝突”,這兩個操作是否會衝突取決於他們是否使用相同的文件集。你可以不相交的兩套文件分區中使用的表的列的操作條件。例如,這兩個命令更新表在哪裏日期>“2010-01-01”…
和刪除表在哪裏日期<“2010-01-01”
按日期將衝突如果表沒有分區,既可以嚐試修改相同的一組文件。分區的表日期
會避免衝突。因此,分區表根據條件常用命令可以顯著減少衝突。然而,分區表的列,高基數可以導致其他性能問題由於大量的子目錄。
衝突異常
當一個事務衝突發生時,您將觀察以下例外:
ConcurrentAppendException
此異常發生在並發操作添加同一個分區中的文件(或任何一個分區表)讀取你的操作。文件添加可以造成的插入
,刪除
,更新
,或合並
操作。
使用默認隔離級別的WriteSerializable
文件還說,由盲目的插入
操作(也就是說,盲目操作,添加數據沒有閱讀任何數據)不與任何操作衝突,即使他們接觸相同的分區(或者任何一個分區表)。如果設置隔離級別可序列化的
,那麼盲目的附加可能衝突。
這通常是在並發拋出異常刪除
,更新
,或合並
操作。而並發操作可能身體上更新不同分區目錄,其中一個可能讀取相同的分區,同時另一個更新,造成衝突。您可以顯式分離,從而避免這種狀況的操作。考慮下麵的例子。
/ /目標的deltaTable分區按日期和國家deltaTable。作為(“t”)。合並(源。作為(“s”),”年代。user_id = t。user_id和s。日期= t。日期AND s.country = t.country")。whenMatched()。updateAll()。whenNotMatched()。insertAll()。執行()
假設你運行以上代碼同時為不同日期或國家。因為每個工作都是工作在一個獨立的分區目標三角洲表,你別指望任何衝突。然而,條件不夠明確,可以掃描整個表,可以與並發衝突操作更新其他分區。相反,您可以重寫你的聲明中添加特定的日期和國家合並條件,如以下示例所示。
/ /目標的deltaTable分區按日期和國家deltaTable。作為(“t”)。合並(源。作為(“s”),”年代。user_id = t。user_id和s。日期= t。日期AND s.country = t.country AND t.date = '"+<日期>+“和t。國家= '"+<國家>+“”)。whenMatched()。updateAll()。whenNotMatched()。insertAll()。執行()
現在這個操作是安全的並發運行在不同的日期和國家。
ConcurrentDeleteReadException
此異常發生在並發操作刪除一個文件,你的讀操作。常見的原因是刪除
,更新
,或合並
重寫的操作文件。
ConcurrentDeleteDeleteException
此異常發生在並發操作刪除一個文件,你的操作也刪除。這可能是由於兩個並發修改相同的文件壓縮操作。
MetadataChangedException
此異常發生在三角洲的並發事務更新元數據表。常見的病因是改變表
操作或寫入你的三角洲表,表的更新模式。
ConcurrentTransactionException
如果流查詢使用相同的檢查點位置同時多次啟動和試圖寫三角洲的表在同一時間。你永遠不應該有兩個流查詢使用相同的檢查點位置和同時運行。
ProtocolChangedException
這個異常可以在下列情況下發生:
當δ表升級到新版本。未來成功的操作可能需要升級你的三角洲湖版本。
當多個作家創建或替換一個表在同一時間。
當多個作家寫一個空路徑在同一時間。
看到表協議版本為更多的細節。