暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

揭秘Mysql事物部分update语句成功,部分失败

原创 春去秋来说运维 2019-12-11
2676

使用mysql数据库的小伙伴们,对mysql怎么控制事物,语句的提交一定要了解清楚,如果应用代码对事物使用不当,就会造成Mysql事物部分update语句成功,部分失败。下面就详细解释其产生的原因

首先说一个mysql的事物提交的参数

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.01 sec)
复制

这个参数很好理解,如果autocommit设置为1,就是开启mysql数据库自动提交的特性,设置为0,则不开启自动提交。这里需要提醒大家的是,设置为1之后,数据库自动提交的意思,每当应用请求一个update,或者insert,或者delete语句时,Mysql就会提交这个语句。请注意,如果应用逻辑要实现的是一个事物包含3条update语句,大家都会认为,3个Update语句如果有一个执行失败,则全部回滚,但是请注意,应用如果没有在代码中显示的去启用事物,mysql数据库执行情况是这样的

1. update t_test set name='test1' where id=1;
2. update t_test set name='test2' where id=2;
3. update t_test set name='test3' where id=3;
复制

数据库成功执行了1和2两个update,第三个sql语句因为锁等或者连接断开,并没有执行,最后的结果是什么呢,就是语句1和语句2被数据库正常提交,并落盘了。我换一个写法,大家就明白了

1. update t_test set name='test1' where id=1;
    commit;
2. update t_test set name='test2' where id=2;
    commit;
3. update t_test set name='test3' where id=3;(锁等或者连接断开,没有执行)
复制

因为事物没有控制,就导致部分update语句成功,部分失败。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论