資料庫透過transaction保證資料不會因為各種天災人禍而消失。當高併發的需求同時湧入,如果沒有transaction,就會產生衝突導致常見的dirty read,Phantom Read發生。
TiDB支持分布式事務,透過SS2PL(strong strict two-phase locking)與MVCC(Multi-Version Concurrency Control)。
TiDB在3.0.8版本之前是採用樂觀事務,當client開始一個transaction,然後執行一次或者多次的DML,此時的DML會先存在TiDB server的buffer中,當client執行commit之後,這時候TiDB server透過prewrite+lock與commit的二階段式,將key與value寫入TiKV。
而在之後的版本,TiDB轉為預設使用悲觀事務。與樂觀事務不同的點在於當client開始一個transaction,執行了DML之後,此時會先對要異動的key上鎖。當client執行commit,則一樣透過二階段式寫入key與value。透過使用悲觀事務,TiDB提供了Read-committed isolation level。
當使用樂觀事務時,在transaction的語法使用上,與MySQL基本上沒什麼差別,同樣使用begin,start transaction,rollback,commit等等。TiDB不同的點在於當執行了begin或者執行了DDL語法,會implicit commit,翻譯成隱式提交。意思是會將前一個transaction自動commit,然後另開一個新的transaction。
而當使用悲觀事務的時候,與MySQL的差異在TiDB不支援Gap lock只支援Row lock且只對讀取到的Row才會上鎖。