我在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。如果行数大得多,它将产生允许另一个线程的作用,尝试执行相同的更新来更新某些行。我已经测试了这一行,它工作正常。
答案 0 :(得分:0)
是的。假设您启用了自动提交(这是您尚未开始事务的默认设置),InnoDB将自动在每个查询周围放置一个事务,这使其成为原子的。它实际上等效于:
START TRANSACTION;
update tablea set status=2 where status=1 and primaryIds in (1,2,3);
COMMIT;