臟讀:一個事務讀到了另一個事務未提交的資料。
有幾點疑問想問下:
1.DML所操作的資料是不是都是在innodb_buffer_pool快取中的資料,check point檢查時才會將資料寫入磁盤?
2.如果事務中的陳述句已經執行,但事務還沒有提交,這時資料庫中的資料已經發生了更改,那事務的提交具體起了什么作用?
3.select讀取資料(即上面的“資料庫中的資料”)是指innodb_buffer_pool快取中的資料還是磁盤中的資料,是不是要根據隔離級別來區分?
這樣理解有沒有問題?
在讀未提交級別下,select在innodb_buffer_pool快取里面讀取資料,所以可能會讀到其他事務未提交的資料,發生臟讀。
在讀已提交級別下,select使用使用快照讀(snapshot read),所以只能讀到磁盤中其他事務已經提交過的資料+事務自身修改但還未提交的資料,避免了臟讀。
求大神解答。
uj5u.com熱心網友回復:
救救孩子吧
uj5u.com熱心網友回復:
我也想知道
uj5u.com熱心網友回復:
讀未提交,select直接去主記憶體里面讀,所以可能讀到沒有提交的資料。
讀已提交和可重復讀,select都是快照讀,而快照中的資料都是已經提交的資料,所以不會發生臟讀。
讀已提交(一次事務中)每次select都是讀取最新的快照,所以在多次select可能結果不一致,發生了不可重復讀。
可重復讀(一次事務中)每次select都是讀第一次select時讀取的快照,所以多次select結果是完全一致的,不會發生不可重復讀,但是讀不到最新提交的資料。
可重復讀下的快照讀+臨鍵鎖(鎖住對應索引記錄的一段區間),也可以避免幻讀,達到串行化級別的隔離效果。
uj5u.com熱心網友回復:
“在讀未提交級別下,select在innodb_buffer_pool快取里面讀取資料,所以可能會讀到其他事務未提交的資料,發生臟讀。”樓主的這句話理解的有誤,讀資料的時候是先讀innodb_buffer_pool,如果有直接回傳,沒有的話從磁盤同步到innodb_buffer_pool;“如果事務中的陳述句已經執行,但事務還沒有提交,這時資料庫中的資料已經發生了更改,那事務的提交具體起了什么作用”。事務是跟鎖和回滾有關聯的;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/41538.html
標籤:基礎類
上一篇:求各位大佬有沒有煤與煤矸石的圖片
