iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0

前面提到TiDB支持樂觀事務與悲觀事務,接下來就實際透過例子來了解在這兩種事務下,TiDB分別會做什麼操作。

首先在樂觀事務的情境下,如下圖所示,開啟了兩個transaction,而兩邊的transaction在下完更新語法之後,右邊的transaction先執行commit。接著左邊要執行commit的時候,會看到錯誤訊息write conflict。這是因為在樂觀事務下,衝突會在執行commit的時候才做檢查。
https://ithelp.ithome.com.tw/upload/images/20210921/20113220RklipCx0Hv.png

接著在悲觀事務的情境下,一樣開啟了兩個transaction,先在右邊下了更新的語法,執行成功。接著在左邊也下了更新的語法,會發現因為這筆資料被上鎖了,所以左邊的transaction在等待右邊做commit的動作
https://ithelp.ithome.com.tw/upload/images/20210921/201132203DrYSBekV1.png
接下來在右邊下commit指令,這時候可以看到左邊的transaction也執行成功,執行時間22.38秒的時間就是因為在等待右邊的transaction釋放鎖。
https://ithelp.ithome.com.tw/upload/images/20210921/20113220u205WH03r0.png

所以在樂觀事務下,高併發會產生衝突錯誤的情況也會越頻繁,這時候可以視使用情境決定是否開放自動retry,以及設定retry的次數。

SET global tidb_disable_txn_auto_retry = OFF;
SET global tidb_retry_limit = 10;

上一篇
D24 - Transaction
下一篇
D26 - 與MySQL相異的部分
系列文
TiDB學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言