MySQL Query是否包含子查询原子?

Nav*_*vin 10 mysql

有两个表:

表1唯一会话

ID    Count 
Run Code Online (Sandbox Code Playgroud)

表2(会议)

ID    Name
Run Code Online (Sandbox Code Playgroud)

我想更新count只有在name会话中不存在才能计算唯一会话,这是一个例子,所以客观不是通过替代方式来做,但问题是:

Rowsaffected = Update table1 
                   set Count = Count + 1 
               where (Select count(*) from table2 where Name = 'user1' ) = 0;

Insert into table2 (NAME) values('user');
Run Code Online (Sandbox Code Playgroud)

首先查询原子查询?如果是,那就没有问题.

如果不是,那么如果有多个线程运行来执行上述操作怎么办?有可能:

线程1:count返回0,它在线程2启动之前更新了表1但没有更新表2.线程2:它找到计数0,它也将更新计数.

现在对于同一个用户,count是2,这不应该发生.

任何建议/反馈.

小智 -1

不确定我是否理解要求,但如果您想获得唯一的会话计数,您只需要一张表。对于 table2 添加用户作为主键(如果还没有):

ALTER TABLE table2 添加用户主键;

然后使用 INSERT IGNORE ,它仅在用户不存在时才插入:

INSERT IGNORE INTO table2 (名称) VALUES ('用户');

然后你可以通过“select count(*) from table2”获得唯一的会话。