髒讀:讀取到了未提交的資料
不可重複讀:乙個事務,兩次讀取到的資料不同。注意,這裡不同是指兩次讀取到的記錄主鍵一樣,但是其中的內容不一樣
幻讀:乙個事務,兩次讀取到的資料記錄不同。注意,這裡的要點是,讀取到了之前沒讀取到的記錄,或者之前讀取的記錄,本次讀取沒有獲取到。
這些問題都是在併發訪問下出現的,如何更好理解這幾個問題呢?
在乙個事務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的...