幻讀以及幻讀的解決方案

2021-10-22 14:00:07 字數 679 閱讀 7178

事務a

事務b事務a按照特定的條件查詢資料,查詢到了2條資料

事務b插入一條資料 commit

事務a按照原條件查詢資料,查詢到還是2條資料

事務a修改其中一條資料的值update,看到修改的範圍是3條資料

事務a按照原條件查詢資料,查詢到3條資料

為什麼出現幻讀:主要原因是快照讀和當前讀混合使用

首先事務a執行了3次讀取操作

第一次和第二次操作都是執行的快照讀,如果是可重複讀的隔離級別下。這兩次讀取的資料是一致的。

而 for update,lock in share mode,update,delete都屬於當前讀,事務執行會執行當前讀,也就是會讀取出事務b插入的資料

都使用當前讀或者快照讀。如果有update,顯然會使用當前讀,所以將前面兩條資料也變成當前讀(對讀取操作加鎖 for update)

事務a事務b

select * from user where age =20 for update;

insert into user values(25,『25』,20);此時會阻塞等待鎖

select * from user where age =20 for update;

事務b中的insert會被阻塞,當事務a提交成功後才會執行成功。

關於當前讀和快照讀會在接下來的mvcc文章中有詳細的介紹

幻讀及其解決方案

在乙個事務開始 第一條sql執行後真正開始 後由於其他事務提交後插入或刪除了資料,導致多次查詢的結果不一樣。表中的每條資料都會新增兩個字段 事務開始後查詢獲取到的資料的範圍 建立版本號 當前事務版本號 保證取出的資料不會有後啟動的事務中建立的資料。刪除版本號為空或 當前事務版本號 保證了至少在該事務...

資料庫幻讀解決方案

有時候我們會有業務場景去解決資料庫幻讀現象 比如某條記錄的某幾個屬性合起來需要在記錄裡唯一 這個時候我們需要做的是新增乙個校驗欄位對他做唯一約束,值是這幾個欄位的拼接 這裡為什麼用校驗欄位而不用原字段呢?有時候我們在做刪除的時候只做邏輯刪除 這時候唯一約束就好導致失效的記錄讓有效的記錄無法插入,而校...

mysql幻讀 mysql 幻讀

幻讀 phantom read 是指當使用者讀取某一範圍的資料行時,b事務在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的 幻影 行。innodb和falcon儲存引擎通 過多版本併發控制機制解決了幻讀問題。a事務讀取了b事務已經提交的新增資料,此時 a 還沒有提交,當前提交後,也...