對Delta Table的所有數據修改操作,都會由MetaService統一進行事務管理,滿足ACID特性,應用MVCC模型來保障讀寫快照隔離,采用OCC模型(樂觀并發控制協議,Optimistic Concurrency Control)進行樂觀事務并發控制。
沖突檢測規則
下表為作業并發提交場景下,對同一個非分區表或分區的并發數據操作先后結束的沖突規則說明。
作業類型 | INSERT OVERWRITE / TRUNCATE (后結束) | INSERT INTO (后結束) | UPDATE / DELETE (后結束) | MINOR COMPACT (后結束) | MAJOR COMPACT (后結束) |
INSERT OVERWRITE / TRUNCAT(先結束) | 先、后結束的作業都會執行成功。 后結束的結果會覆蓋先結束的結果。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 |
INSERT INTO (先結束) | 先、后結束的作業都會執行成功。 后結束的結果會覆蓋先結束的結果。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先,后結束的作業執行成功。 后結束的作業Compact成功。 | 先結束的作業執行成功。 后結束的作業會報錯。 |
UPDATE / DELETE (先結束) | 先、后結束的作業都會執行成功。 后結束的結果會覆蓋先結束的結果。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先,后結束的作業執行成功。 后結束的作業Compact成功。 | 先結束的作業執行成功。 后結束的作業會報錯。 |
MINOR COMPACT (先結束) | 先,后結束的作業執行成功。 后結束的結果會覆蓋先結束的結果。 | 先,后結束的作業執行成功。 后結束的作業只會追加自身的新數據。 | 先,后結束的作業執行成功。 后結束的作業只會追加自身的新數據。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先,后結束的作業執行成功。 后結束的作業Compact成功。 |
MAJOR COMPACT (先結束) | 先,后結束的作業執行成功。 后結束的結果會覆蓋先結束的結果。 | 先,后結束的作業執行成功。 后結束的作業只會追加自身的新數據。 | 先,后結束的作業執行成功。 后結束的作業只會追加自身的新數據。 | 先結束的作業執行成功。 后結束的作業會報錯。 | 先結束的作業執行成功。 后結束的作業會報錯。 |
并發沖突優化
通過上面沖突規則表格可知,目前并不支持行級別或者文件級別的事務并發控制,而是以每次批處理數據操作作為一個單獨的事務來管理。對于部分高頻的操作,會結合它的語義,在保障正確性的前提下,單獨設計優化了事務沖突邏輯,來更好支持并發控制。
比如對于Clustering操作和Insert into并發執行,即使事務Start和Commit時間出現交叉也不會沖突失敗,因為Clustering操作雖然改變了數據組織方式,但沒有改變數據本身的狀態,和其他數據更新操作并沒有影響一致性的沖突,因此允許并發執行。這部分后續還會持續優化,擴大應用場景。
對于沖突檢測失敗的處理,在保證正確性的前提下會盡量先做meta級別的重試優化,不用重新讀寫數據,提升用戶體驗的同時,也能節省資源消耗。
最后一步是原子性提交元數據更新,保證數據一致性。
目前只支持單表事務管理。
數據文件版本管理
每次事務操作會生成一批新的數據文件,這些數據文件會綁定對應的事務版本,主要包含兩個屬性:
時間版本:Timestamp類型,等效于事務Commit時間,只有由用戶觸發并且存在邏輯數據變更的操作才會產生新的時間版本,Clustering和Compaction操作只是對物理數據進行了重新組織優化,并沒有實際新增或者修改數據,因此不會產生新的時間版本,這樣做的好處是用戶使用時間版本進行增量查詢時,Clustering和Compaction產生的數據文件不會作為新增數據被查詢輸出,滿足用戶實際的業務場景。
ID版本:自增的整型,任何數據操作的事務,都會產生一個增量的ID版本,包括引擎內部執行的Clustering和Compaction操作,主要用于內部的事務管理需要。ID版本也會對用戶透出,并且也可用于增量查詢。