對Delta Table的所有資料修改操作,都會由MetaService統一進行交易管理,滿足ACID特性,應用MVCC模型來保障讀寫快照隔離,採用OCC模型進行樂觀事務並發控制。
衝突檢測規則
下表為作業並發提交情境下,對同一個非分區表或分區的並發資料操作先後結束的衝突規則說明。
作業類型 | 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版本也會對使用者透出,並且也可用於增量查詢。