隔離性與髒讀 幻讀 不可重複讀的理解

2022-04-14 11:00:08 字數 844 閱讀 8178

髒讀:讀取到了未提交的資料

不可重複讀:乙個事務,兩次讀取到的資料不同。注意,這裡不同是指兩次讀取到的記錄主鍵一樣,但是其中的內容不一樣

幻讀:乙個事務,兩次讀取到的資料記錄不同。注意,這裡的要點是,讀取到了之前沒讀取到的記錄,或者之前讀取的記錄,本次讀取沒有獲取到。

這些問題都是在併發訪問下出現的,如何更好理解這幾個問題呢?

在乙個事務a進行資料庫操作時,另外的事務b可能進行一些操作:

b修改、新增了資料,但未提交,此時a去查詢資料庫

a查詢資料庫 --> b修改資料並且提交 --> a再次查詢資料庫

a查詢資料庫 --> b新增資料並且提交 --> a再次查詢資料庫

對應上面的問題,於是對應的有幾種隔離。

read uncommitted:未作任何隔離,此時之前的1、2、3都可能發生

read committed(rc):顧名思義,唯讀提交後的資料,那麼可以解決問題(1)髒讀

repeatable read(rr):解決(2)不可重複讀的問題的隔離機制

serializable: 解決幻讀的隔離級別

mysql預設採用rr級別,但是mysql的rr級別,也可解決幻讀問題。

這種控制多事務併發隔離的做法,有個名字叫mvcc(多版本併發管理)。

mysql的實現方式:通過在每條記錄後面增加兩個事務版本號,版本號是每個事務開始時唯一生成的。兩個版本號乙個儲存建立版本,乙個儲存刪除版本。

查詢時,事務只查詢

那麼修改呢?修改時,mysql會生成一條新記錄,並更新原記錄刪除版本號。這樣

髒讀,不可重複讀,幻讀

髒讀,不可重複讀,幻讀是由於資料庫事務的隔離性導致的問題。髒讀 乙個事務讀取到了其它未提交事務操作的記錄。不可重複讀 乙個事務a內,首次查詢到一條相同記錄,然後事務b修改該條記錄並提交,事務a再次執行相同查詢,得到了事務b更新後的結果,事務a兩次相同的查詢,卻得到了不同的結果,這個叫做不可重複讀。是...

髒讀 不可重複讀 幻讀

髒讀 事務a使用了資料,但是還沒來得及提交,事務b就使用了這個資料,對於事務b來說就是髒讀。允許髒讀 sql server select from category with nolock 不可重複讀 事務a在9點和12點都會操作乙份資料,但是在10點的時候,事務b也操作了該份資料,並且使其數值進行...

髒讀 不可重複讀 幻讀

總結 對於不可重複讀和幻讀的區別是 不可重複讀圈了一塊地,這塊地不允許任何人動用,但是不管旁邊的地方是否開闢了一塊地。幻讀是不僅是圈的地,而且附近也不允許有新的地。這個對於區間查詢會有影響。所以不可重複讀和幻讀最大的區別是區間查詢的結果會不會一樣。幻讀保證結果一樣,但是不可重複讀不保證。mysql的...