视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql中autocommit与sql回滚的关系_MySQL
2020-11-09 18:19:45 责编:小采
文档


bitsCN.com
mysql中autocommit与sql回滚的关系 今天群里有人问了一个mysql中sql执行出错是否会回滚的问题。第一个感觉这个答案应该和autocommit有关。 首先交代下背景,问题复现一下:执行sql: 1root@wlb 12:48:30>update wlb_schedule_02 set status=status*10 where gmt_create<="2012-08-16 1:00:00";然后报了error:1ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again首先这是对多行进行了操作,如果其中一行出错或者执行到某行时出错,那么之前的语句是否会回滚?答案是肯定的。但是什么时不会回滚,什么时候又会回滚呢?这个和autocommit又有什么关系呢?1show VARIABLES like '%autocommit%';显示autocommit是否打开,然后关闭autocommit1set autocommit=0;然后对test1表插入数据,其中那么字段是非空的,所以插入空值时肯定报错了1INSERT INTO test1 (age,name) VALUEs (20,'1');2INSERT INTO test1 (age,name) VALUEs (20,'2');3 INSERT INTO test1 (age,name) VALUEs (20,null);4INSERT INTO test1 (age,name) VALUEs (20,'4');因为不会自动提交,所以执行到第三条是会全部回滚,所以最后数据库中没有数据然后把autocommit打开1set autocommit=1;再执行插入语句:1INSERT INTO test1 (age,name) VALUEs (20,'1');2INSERT INTO test1 (age,name) VALUEs (20,'2');3INSERT INTO test1 (age,name) VALUEs (20,null);4INSERT INTO test1 (age,name) VALUEs (20,'4');因为会自动提交,所以执行完前两条的时候,数据会插入数据库,然后第三条的时候就报错了。所以数据库中会有两条数据。解析来我们来模拟今天的实际问题,我们把autocommit设置成ture 然后执行下面的语句1INSERT INTO test1 (age,name) VALUEs (20,'1'),(20,'2'),(20,null),(20,'4');虽然是autocommit了,整个语句也会报错,执行到第三条的时候也会报错,但是前两条也没有提交成功。总结一下,如果是多次插入或修改多行的数据时,autocommit会影响执行成功的数据是否提交。如果在一条语句中执行的时候,那么会把整个操作当成一个事务来执行,所以这时候autocommit是否打开也没有作用了。单条语句成功就成功,失败即回滚。 作者 艮子明 bitsCN.com

下载本文
显示全文
专题