程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql中autocommit與sql回滾的關系

mysql中autocommit與sql回滾的關系

編輯:MySQL綜合教程


mysql中autocommit與sql回滾的關系   今天群裡有人問了一個mysql中sql執行出錯是否會回滾的問題。第一個感覺這個答案應該和autocommit有關。   首先交代下背景,問題復現一下: 執行sql:   www.2cto.com   1 root<a href="http://my.oschina.net/u/203327" target="_blank" rel="nofollow">@wlb</a>  12:48:30>update wlb_schedule_02 set status=status*10 where gmt_create<="2012-08-16 1:00:00"; 然後報了error: 1 ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again 首先這是對多行進行了操作,如果其中一行出錯或者執行到某行時出錯,那麼之前的語句是否會回滾?答案是肯定的。 但是什麼時不會回滾,什麼時候又會回滾呢?這個和autocommit又有什麼關系呢? 1 show VARIABLES like '%autocommit%'; 顯示autocommit是否打開,然後關閉autocommit 1 set autocommit=0; 然後對test1表插入數據,其中那麼字段是非空的,所以插入空值時肯定報錯了 1 INSERT INTO test1  (age,name) VALUEs (20,'1'); 2 INSERT INTO test1  (age,name) VALUEs (20,'2'); 3  www.2cto.com   INSERT INTO test1  (age,name) VALUEs (20,null); 4 INSERT INTO test1  (age,name) VALUEs (20,'4'); 因為不會自動提交,所以執行到第三條是會全部回滾,所以最後數據庫中沒有數據 然後把autocommit打開 1 set autocommit=1; 再執行插入語句: 1 INSERT INTO test1  (age,name) VALUEs (20,'1'); 2 INSERT INTO test1  (age,name) VALUEs (20,'2'); 3 INSERT INTO test1  (age,name) VALUEs (20,null); 4 INSERT INTO test1  (age,name) VALUEs (20,'4'); 因為會自動提交,所以執行完前兩條的時候,數據會插入數據庫,然後第三條的時候就報錯了。所以數據庫中會有兩條數據。 解析來我們來模擬今天的實際問題,我們把autocommit設置成ture   www.2cto.com   然後執行下面的語句 1 INSERT INTO test1  (age,name) VALUEs (20,'1'),(20,'2'),(20,null),(20,'4'); 雖然是autocommit了,整個語句也會報錯,執行到第三條的時候也會報錯,但是前兩條也沒有提交成功。 總結一下,如果是多次插入或修改多行的數據時,autocommit會影響執行成功的數據是否提交。如果在一條語句中執行的時候,那麼會把整個操作當成一個事務來執行,所以這時候autocommit是否打開也沒有作用了。單條語句成功就成功,失敗即回滾。     作者 艮子明

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved