MySQL 事務隔離級別

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超時。這種狀況,存在性能問題,由於要一個一個來。

相關文章
相關標籤/搜索