单个查询是否可以更新MySQL Atomic中的多行?

时间:2020-05-28 13:57:11

标签: mysql atomic

我在SpringJPA中执行的MySQL InnoDb表中有一个查询,该查询更新了多行。我想确保查询完成,并且它将更新的行不能由任何其他进程更新。这是在多CPU环境中,因此我必须在数据库级别进行锁定。

我首先用这样的查询选择行:

select * from tablea where status = 1;

假设这将返回3行-主ID 1,2,3

我想阻止并发更新,所以我进行了此更新:

update tablea set status=2 where status=1 and primaryIds in (1,2,3);

我要完成的工作是检查我要更新的所有行的状态仍然是原始值,并且在我下面没有更新。然后,我得到更新的行数,并将其与主ID的数量(3)进行比较,以了解我的查询是否已更新所有行。我的问题是此查询原子-将返回3还是0。如果行数大得多,它将产生允许另一个线程的作用,尝试执行相同的更新来更新某些行。我已经测试了这一行,它工作正常。

1 个答案:

答案 0 :(得分:0)

是的。假设您启用了自动提交(这是您尚未开始事务的默认设置),InnoDB将自动在每个查询周围放置一个事务,这使其成为原子的。它实际上等效于:

START TRANSACTION;
update tablea set status=2 where status=1 and primaryIds in (1,2,3);
COMMIT;
相关问题