mysql 事務隔離級別mysql
read-uncommitted(未提交讀)sql
測試流程:數據庫
- 一、A設置read-uncommitted, start transaction
- 二、B執行start transaction,修改一條記錄,
- 三、A查詢記錄,獲得了覺得正確的記錄
- 四、B回滾。
問題:A讀到了B沒有提交的記錄,也就是髒讀。性能
** read-committed(已提交讀)**測試
測試流程:事務
- 一、A設置read-committed, start transaction
- 二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
- 三、A查詢記錄,結果仍是老的記錄
- 四、B提交事務
- 五、A再次查詢記錄,結果是新的記錄。
問題:解決了髒讀的問題,可是出現一個新問題,A在一個事務中,兩次讀取的記錄不一致,也就是不可重複讀。it
repeatable-read(可重複讀)io
測試流程:table
- 一、A設置repeatable-read, start transaction,查詢記錄,結果是老的記錄
- 二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
- 三、A查詢記錄,結果仍是老的記錄
- 四、B提交事務
- 五、A再次查詢記錄,結果仍是老的記錄。
問題:能夠重複讀,A在事務過程當中,即便B修改了數據,而且commit,A讀取的仍是老的數據。其實是A讀取的數據仍是事務開始時的快照。 注意:這裏可能會存在一個新的問題,A在事務過程當中,B增長一條記錄,並提交,致使A的兩次讀取不一致,會多一條記錄,也就是幻影讀。這裏只是可能,具體取決於數據庫的實現。mysql的repeatable-read實現,不會致使幻影讀。數據
serializable(可串行化) 測試流程:
- 一、A設置serializable, start transaction,查詢記錄,結果是老的記錄
- 二、B執行start transaction,修改一條記錄,B卡在這裏,要等待A完成才行。
- 三、A查詢記錄,結果仍是老的記錄,A提交。
- 四、B的修改操做才進行下去。
注意:B在等待過程當中,會出現lock超時。這種狀況,存在性能問題,由於要一個一個來。