標籤:
read-uncommitted(未提交讀)
測試流程:
1、A設定read-uncommitted, start transaction
2、B執行start transaction,修改一條記錄,
3、A查詢記錄,得到了以為正確的記錄
4、B復原。
問題:A讀到了B沒有提交的記錄,也就是髒讀。
read-committed(已提交讀)
測試流程:
1、A設定read-committed, start transaction
2、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改成功
3、A查詢記錄,結果還是老的記錄
4、B提交事務
5、A重新查詢記錄,結果是新的記錄。
問題:解決了髒讀的問題,但是出現一個新問題,A在一個事務中,兩次讀取的記錄不一致,也就是不可重複讀取。
repeatable-read(可重複讀)
測試流程:
1、A設定repeatable-read, start transaction,查詢記錄,結果是老的記錄
2、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改成功
3、A查詢記錄,結果還是老的記錄
4、B提交事務
5、A重新查詢記錄,結果還是老的記錄。
問題:可以重複讀,A在事務過程中,即使B修改了資料,並且commit,A讀取的還是老的資料。
注意:這裡可能會存在一個新的問題,A在事務過程中,B增加一條記錄,並提交,導致A的兩次讀取不一致,會多一條記錄,也就是幻影讀。這裡只是可能,具體取決於資料庫的實現。mysql的repeatable-read實現,不會導致幻影讀。
serializable(可序列化)
測試流程:
1、A設定serializable, start transaction,查詢記錄,結果是老的記錄
2、B執行start transaction,修改一條記錄,B卡在這裡,要等待A完成才行。
3、A查詢記錄,結果還是老的記錄,A提交。
4、B的修改操作才進行下去。
注意:B在等待過程中,會出現lock逾時。這種情況,存在效能問題,因為要一個一個來。
mysql 交易隔離等級