8
回答
mysql sql中部分执行成功会怎样?

1:update from tb_test set mid = 1 where id in(1,2,3,……)
2:insert into tb_test(id,mid) values (1,2), (2,3), (3,4), (……)

听说:写操作时会自动加排它锁,并且上面这种情况,锁行是一行一行的锁,然后最后同时释放锁,即锁一行,操作一行,直至没有条件,最后同时释放所有锁 by http://hedengcheng.com/?p=771

不开启事务,InnoDB表

问题1:假如更新/操作时部分执行失败了(由于主键或者唯一索引等原因导致更新失败),但是按照上面理解的,对写操作的分析,虽然最终sql执行失败,那是不是会有部分更新/新增操作成功了呢?

问题2:对于sql部分执行成功,会出现“部分生效”好像是有个mysql或者pdo的配置啊,上次在这里看到一个类似的问题,好像有说到,找半天找不到真是急死人了。

举报
xiasf
发帖于3年前 8回/557阅
共有8个答案 最后回答: 3年前

不会部分执行成功的,innodb 单条语句也是作为事务执行的。

--- 共有 11 条评论 ---
逝水fox回复 @xiak : 看业务和实现,有些不重要的数据没那么强调一致性,比如只是一个发发文章的网站。MyISAM确实比较老了,5.5以来InnoDB的优化还是看得见的。 3年前 回复
xiasf回复 @逝水fox : 那这样用myisam表岂不是很危险很危险啊!!! 3年前 回复
xiasf回复 @逝水fox : myisam表测试的结果会部分成功更新, innodb表测试的结果是你说的,单条sql是原子性的,sql语句报错,返回假,都不成功。 3年前 回复
xiasf回复 @逝水fox : 刚测试了,第一条更新成功了,第二条失败了,sql语句报错,返回的是假 3年前 回复
xiasf回复 @逝水fox : 嗯嗯,我测试一下,我就是不放心吗,记得看过一篇文章讲过这个问题的,就是想找到那个,真郁闷,经常看到的东西,忘了再也找不到了:( 3年前 回复
这个和模式无关,和你任何设置都无关吧。一个程序对外就是一个统一体,咱不管它内部怎么执行,一条SQL语句,哪怕它本身是一个批量操作,在具体数据上,也不会出现一半成功一半失败的情况吧。这是基本原理的问题,哪怕我没看过这方面的任何文章,也相信它不会违背这种基本原理。
--- 共有 1 条评论 ---
xiasf是吗?那就是说,我单方面的想多了是吗? 3年前 回复

引用来自“594zzb”的评论

是会回滚的,你这种情况不会出现部分提交部分未提交的情况,毕竟是同一条语句
不管是innodb还是myisam都会回滚是吗,你怎么知道呢?
是不是有这个配置啊?
我就是想知道:
1:当sql出错时mysql是否续执行?
2:当前失败的sql的修改不会生效吧?
3:对于这种一条sql 更新多条记录的 update from tb_test set mid = 1 where id in(1,2,3,……) 更新成功的行会生效吗,是否会出现一条sql的执行导致部分生效?
4:即使部分执行成功也还是返回失败吗?
5:还是全部都不生效?
你这个现象完全可以自己测试得到结果:
select now2() from dual;
select 123 from dual;
这种情况第二条语句是不会执行的,如果你说的是你问题中的那个update语句的话,你可以这样测试
update from tb_test set mid=1 where id in(1,1_1,2);
1_1是个错误的id,执行下你就知道结果了,答案是不会执行的,且不会吧1,2的数据进行更新的。
根据这个案例你会得到
1.当sql出错时mysq是不会继续执行
2.当前失败的sql的修改是不会生效的
3.不会出现部分生效的可能
4.不存在这种部分成功的情况
5.是全部不生效的


当然如果你是在代码层面使用了两次语句的调用
A.updateData() ;//1
A.insertData();  //2
那么如果没有在代码配置事务控制的话,可能会出现1出错,但是2是会执行的,这个你要知道。我所回答你的是单条sql的多数据更新操作的情况
--- 共有 2 条评论 ---
594zzb恩,所以说实验是检验真理的标准,我自己都不知道myisam会有部分成功的可能。我也是学到了 3年前 回复
xiasf我刚测试了:update from tb_test set mid=1 where id in(1,1_1,2); myisam表测试的结果会部分成功更新, innodb表测试的结果是你说的,单条sql是原子性的,sql语句报错,返回假,都不成功。 3年前 回复
我觉得你应该先看看数据库基础。
--- 共有 3 条评论 ---
xiasf回复 @魔力猫 : 我测试的结果真是这样的 3年前 回复
魔力猫@xiak myisam的情况超乎我的想象,这也能叫数据库? 3年前 回复
xiasf我刚测试了:update xxx set mid = 5 where id in(1,2,3,4); myisam表测试的结果会部分成功更新, innodb表测试的结果是你说的,单条sql是原子性的,sql语句报错,返回假,都不成功。 这个基础的mysql只是根本不会讲到这个的,基础的只是事物都没有提到,要不是我想太多,一般人谁知道有这个隐含的问题所在啊。 3年前 回复

问题1:innodb sql执行错误,数据不会变化,misaim已经执行成功的修改和插入不会回滚

问题2:不知道

mark等懂的人讲解

--- 共有 1 条评论 ---
xiasf^_^ 3年前 回复
顶部