前面提到TiDB支持樂觀事務與悲觀事務,接下來就實際透過例子來了解在這兩種事務下,TiDB分別會做什麼操作。
首先在樂觀事務的情境下,如下圖所示,開啟了兩個transaction,而兩邊的transaction在下完更新語法之後,右邊的transaction先執行commit。接著左邊要執行commit的時候,會看到錯誤訊息write conflict。這是因為在樂觀事務下,衝突會在執行commit的時候才做檢查。
接著在悲觀事務的情境下,一樣開啟了兩個transaction,先在右邊下了更新的語法,執行成功。接著在左邊也下了更新的語法,會發現因為這筆資料被上鎖了,所以左邊的transaction在等待右邊做commit的動作
接下來在右邊下commit指令,這時候可以看到左邊的transaction也執行成功,執行時間22.38秒的時間就是因為在等待右邊的transaction釋放鎖。
所以在樂觀事務下,高併發會產生衝突錯誤的情況也會越頻繁,這時候可以視使用情境決定是否開放自動retry,以及設定retry的次數。
SET global tidb_disable_txn_auto_retry = OFF;
SET global tidb_retry_limit = 10;