對 MySQL 隔離級別問題怎樣會產生的理解

2021-10-09 04:29:04 字數 929 閱讀 4561

不同的隔離級別會造成三種問題,髒讀、不可重複讀、幻讀。以下討論是在不使用mvcc多版本控制的情形下產生這三種問題的原因的理解。

一開始我總是難以理解這三種問題如何會發生(特別是髒讀),後來想清楚以後覺得最重要的點在於我們思考這個問題的時候要想到一點:所謂的對資料庫資料進行修改或者讀取操作的互斥的問題,其本質是在修改或者讀取之前加鎖才會讓修改或者讀取看起來是互斥的,其實只有鎖才會互斥;不加鎖的讀取或者修改資料的事物(哪怕只有一方加了鎖)也是可以同一時間讀取和修改同一條資料的。

髒讀,就是乙個事物t1讀到了事物t2還沒提交的資料。

如何會造成髒讀:如果t1事物在讀取資料的時候沒有加鎖(讀鎖),t2事物在修改資料的時候不管有沒有加鎖(寫鎖);這時候在t1讀取期間不排斥其他事物的讀或者寫,t2仍然可以修改資料,並且在t2還沒提交之前,t1也能夠讀到t2修改的但沒有提交的資料。如果t1在讀取期間加了讀鎖,在t1讀取期間是不允許t2(如果t2對資料的修改需要加鎖的話)進行修改的,也就不存在讀到修改但未提交的資料的問題。

不可重複讀,就是乙個事物t1在事物裡面執行了兩次同樣的查詢操作比如where name='xiaoming',每次查詢的時候查詢完了就立即把讀鎖釋放,所以在兩次查詢期間有可能會被另乙個事物t2加寫鎖修改後提交,所以t1在第二次查詢的時候有可能查詢到不一樣的資料。

可重複讀,事物t1進行了兩次讀操作,第一次讀的時候加了讀鎖並且一直等到事物提交才釋放,所以在事物期間不管讀幾次因為加了讀鎖,別的事物無法加寫鎖修改,所以可以保證可重複度。

序列讀,事物t1在讀的時候加表讀鎖,所以在事物期間不會有另外的事物插入的情況,所以不會發生幻讀。

隔離級別問題彙總

隔離級別分類 事務隔離級別 髒讀不可重複讀 幻讀讀未提交是是 是不可重複讀否是 是可重複讀否否 是序列化否否 否什麼是幻讀 事務a 按照一定條件進行資料讀取,期間事務b 插入了相同搜尋條件的新資料,事務a再次按照原先條件進行讀取時,發現了事務b新插入的資料稱為幻讀。如果事務a 按一定條件搜尋,期間事...

mysql鎖問題 事務隔離級別

相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。innodb最大的特點就是一是支援事務 transaction 二是採用了行級鎖。所以我們先來引申一下事務和事務隔離級別的知識。1.1 事務以及acid屬性 事務是由一組sql語句組成的邏輯處理單元,事務...

MySQL事務隔離級別 解決併發問題

mysql事務隔離級別 1.髒讀 騙錢的手段,兩個視窗或執行緒分別呼叫資料庫轉賬表,轉賬後未提交,對方檢視到賬後,rollback,實際錢沒轉.演示方法 mysql預設的事務隔離級別為repeatable read 比oracle高,因為mysql本身弱 使用select tx isolation ...