在乙個事務開始(第一條sql執行後真正開始)後由於其他事務提交後插入或刪除了資料,導致多次查詢的結果不一樣。
表中的每條資料都會新增兩個字段:
事務開始後查詢獲取到的資料的範圍
建立版本號<=當前事務版本號 保證取出的資料不會有後啟動的事務中建立的資料。
刪除版本號為空或》當前事務版本號 保證了至少在該事務開啟之前資料沒有被刪除,是應該被查出來的資料。
mvcc使用快照讀的方式解決了部分幻讀問題,但是在修改時由於還是當前讀,還是有幻讀問題,這個時候的解決方案就是gap鎖。
幻讀以及幻讀的解決方案
事務a 事務b事務a按照特定的條件查詢資料,查詢到了2條資料 事務b插入一條資料 commit 事務a按照原條件查詢資料,查詢到還是2條資料 事務a修改其中一條資料的值update,看到修改的範圍是3條資料 事務a按照原條件查詢資料,查詢到3條資料 為什麼出現幻讀 主要原因是快照讀和當前讀混合使用 ...
資料庫幻讀解決方案
有時候我們會有業務場景去解決資料庫幻讀現象 比如某條記錄的某幾個屬性合起來需要在記錄裡唯一 這個時候我們需要做的是新增乙個校驗欄位對他做唯一約束,值是這幾個欄位的拼接 這裡為什麼用校驗欄位而不用原字段呢?有時候我們在做刪除的時候只做邏輯刪除 這時候唯一約束就好導致失效的記錄讓有效的記錄無法插入,而校...
Mysql鎖 幻讀解決方案 間隙鎖
1.在可重複讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的資料的。因此,幻讀在 當前讀 下才會出現。2.幻讀指新插入的行,讀到原本存在行的更新結果不算。因為當前讀的作用就是能讀到所有已經提交記錄的最新值。產生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的 間隙...