mysql筆記系列 事務隔離級別詳細分析

2021-07-25 03:17:29 字數 1649 閱讀 6111

注意:設定a事務的會話事務隔離隔離,只是在a事務在讀取b事務才起作用,對於a事務而言,不管b的會話事務隔離級別是什麼都不要緊!!!(與全域性事務隔離級別無關)

1、讀取未提交內容read uncoommitted,對應的操作為臟讀,提高隔離級別可解決此問題

2、讀取提交內容read committed,能發生不可重複讀的問題,提高隔離級別可解決此問題

3、可重複讀repeatable read,對新插入的資料會發生幻讀現象,提高隔離級別可解決此問題,也有別的解決方案

4、可序列化serializable,隔離級別的最高端,解決了前面的所有問題

1、mysql的儲存引擎為innodb,而innodb的事務隔離級別預設為可重複讀repeatable read

2、mysql事務隔離級別有全域性global和會話session事務隔離級別,分別為global.tx_isolation和session.tx_isolation

準備工作:開啟兩個mysql命令視窗,這裡命名為a和b

a和b事務隔離級別不作改變,均為預設值repeatable read,a和b的事務自動提交模式設定為關閉,關閉命令為:

set autocommit = off;

或 set autocommit = 0;

注意:測試過程中不要插入中文資料,預設的編碼格式會導致無法插入資料和顯示亂碼

測試流程:接著測試1開始測試流程:

說明:打星號2步查詢到的結果不一樣,這種現象就叫不可重複讀,也就是相同的查詢讀取的結果不一樣!

接著測試2開始測試流程:

修改測試:

- a修改會話事務隔離級別為repeatable read,並commit,否則還是read committed

- b中修改一條資料,不commit

- a中查詢不到修改的資料

- b中commit

- a能還是查詢不到b中修改的資料,依然是修改前的資料,這就叫可重複讀

- a中commit

- a中這時能查詢到修改後的資料了

插入測試:

- b中插入的一條資料,不commit

- a查詢不到插入的資料

- b中commit

- a能還是查詢不到b中插入的資料,依然是插入前的資料,這也是可重複讀

- a中commit

- a中這時能查詢到插入的資料了

幻讀測試:

- a中更新所有資料,不commit

- b中插入一條資料,按回車執行時,則會等待a的commit,直到超時

- a中commit,則b執行插入,但不commit

- a中查詢不到b插入的資料

- b中commit

- a中這時能查詢到插入的資料了,這就是幻讀,也就是兩次查詢的結果不一樣,發現還有一條資料沒有修改,就像是幻覺一樣!

可序列化serializable指的是多個事務序列執行

MySQL系列 事務隔離級別

序號 隔離級別 設定命令 查詢隔離級別 1讀未提交 read uncommitted 讀取未提交 持久化 的資料 set session transaction isolation level read uncommitted 2讀已提交 read committed 讀取已隱式提交 持久化 的資料...

mysql 筆記 隔離級別 事務

1 隔離級別 低階別的隔離通常可以執行更高的併發,系統 開銷也更低 2 read uncommitted 事務可以讀取未提交的資料,髒讀,應少用 3 read committed 不可重複讀,事務只能看見已提交的事務所做的修改,大多數資料庫使用這一級別,mysql不是 4 repeatable re...

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...