MySQL/Transaction

維基教科書,自由的教學讀本

Innodb開始支持事務。默認是自動提交,除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。

set autocommit=0 設置事務非自動提交。自此句執行以後,每個SQL語句或者語句塊所在的事務都需要顯示"commit"才能提交事務。

通過以下命令可以查看當前autocommit模式

 show variables like 'autocommit';
 select @@autocommit;

注意事項:

  • 不管autocommit 是1還是0 ,START TRANSACTION 後,只有執行了commit數據才會生效,ROLLBACK就會回滾。
  • 當autocommit 為 0 時,不管有沒有START TRANSACTION,只有執行了commit數據才會生效,ROLLBACK後就會回滾。關閉了資料庫連接並不會自動提交。
  • 當autocommit 為1是 ,且沒有START TRANSACTION,則調用ROLLBACK是沒有用的,即便設置了SAVEPOINT。


  • 髒讀:一個事務讀取到了另一個事務未提交的數據,這是特別危險的,要盡力防止。
  • 不可重複讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。(一個事務讀取到了另一個事務已經提交的數據:增加記錄、刪除記錄、修改記錄),在某寫情況下並不是問題,在另一些情況下就是問題。
  • 虛讀:是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。(一個事務讀取到了另一個事務已經提交的數據---增加記錄、刪除記錄),在某寫情況下並不是問題,在另一些情況下就是問題。

四個隔離級別:

  • Serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(串行化)
  • Repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)不可以避免虛讀
  • Read committed:可避免髒讀情況發生(讀已提交)
  • Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)


  • 安全性考慮:Serializable>Repeatable read>Read committed>Read uncommitted
  • 資料庫效率:Read uncommitted>Read committed>Repeatable read>Serializable

一般情況下,我們會使用Repeatable read、Read committed

mysql資料庫默認的資料庫隔離級別Repeatable read

mysql中設置資料庫的隔離級別語句:

set [global/session] transaction isolation level xxxx;

mysql中設置資料庫的隔離級別語句:

select @@tx_isolation;