您好,登錄后才能下訂單哦!
本篇內容主要講解“mysql中autocommit與sql回滾有什么關系”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql中autocommit與sql回滾有什么關系”吧!
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是否打開也沒有作用了。單條語句成功就成功,失敗即回滾。
到此,相信大家對“mysql中autocommit與sql回滾有什么關系”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。