TiDB事物隔離級別以及樂觀鎖模型介紹

2021-08-21 10:22:41 字數 707 閱讀 7540

tidb支援ansi sql-92標準中的「讀已提交」和「可重複讀」兩種事物隔離級別。對於「可重複讀」隔離級別,在tidb中叫做「snapshot isolation」(快照隔離級別,簡稱si),這種隔離級別不會產生「幻像讀」,但是會產生寫偏斜(write skew)。tidb預設的事物隔離級別是si,可以通過相關語句設定為「讀已提交」隔離級別。

注意:(1) 上面所說的si隔離級別與可重複讀是有細微差異的,開發人員一定要注意

(2)  tidb官方文件所說支援「讀已提交」隔離級別,實質上還是si級別;與ansi標準是不同的。

tidb 使用樂觀鎖模型,在事物中執行update、insert、delete等語句時不像mysql那樣使用行級鎖鎖定相關記錄行,只有在事物真正提交時才會檢查寫寫衝突。如果有衝突(即不同事物併發修改了相同的記錄行),tidb會自動進行重試;如果自動重試失敗,tidb會返回錯誤訊息給客戶端。應用端需要注意檢查 commit 的返回值,即使事物執行時沒有出錯,commit的時候也可能會出錯。

tidb 所使用的這種樂觀鎖模型在衝突嚴重的場景下,會比較低效,因為衝突導致失敗的事物所執行的所有語句都是無效的,tidb自動重試時需要重複做這些操作。舉乙個比較極端的例子,就是把資料庫當做計數器用,如果訪問的併發度比較高,那麼一定會有嚴重的衝突,導致大量的重試甚至是超時。但是如果訪問衝突並不十分嚴重,那麼樂觀鎖模型具備較高的效率。所以在衝突嚴重的場景下,推薦在系統架構層面解決問題,比如將計數器放在 redis中。

事物隔離級別

自然也是支援四種事務隔離級別的 read uncommitted,read commit,repeatable read serializable,下面就分別最四種隔離級別在實現的鎖機制做乙個簡介 serializable 1 這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有...

事物隔離級別

隔離級別從松到緊 讀未提交,讀提交 重複讀,序列化。讀未提交 可能會出現髒讀的情況 例子 你去買5個包子。人多。店員拿的急多方乙個,袋子裡有6個,這個時候,你眼睛一瞟。心裡美滋滋。付錢的時候老闆檢查了一下,發現多了乙個,就拿走了乙個,然後你付錢走人 提交事務 這時候你就發現實際上袋子裡只有5個,但是...

事物隔離級別

在分布式的系統中,通常會有多個執行緒連線到資料庫中同時對乙個表進行操作 這裡的同時並不表示同乙個時間點,而是同時競爭cpu的資源,至於如何排程,就要看執行緒和作業系統如何進行排程了 這種情況下如果會話的事物設定不當,就會導致資料混亂,常常會出現以下三種情況 假設現在系統中有兩個會話a和b,同時對錶t...