2011-04-28 67 views
9

有两个表:包含子查询的MySQL查询是否为原子?

表1的唯一会话

ID Count 

表2(会话)

ID Name 

我想count只有name更新不存在进入会话来计算独特的会话,这是一个例子,所以客观是不要以另一种方式来做,但是que stion是:

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

Insert into table2 (NAME) values('user'); 

是第一个查询原子查询吗?如果是的话,那就没有问题了。

如果不是,那么如果有多个线程运行来执行上述操作会怎样?有机会:

线程1:计数返回0,在线程2启动之前它已经更新了表1,但没有更新表2。 线程2:它发现计数为0,它也将更新计数。

现在对于同一个用户,计数是2,不应该发生。

任何建议/反馈。

回答

1

这取决于您正在使用的存储引擎。

你的榜样将只与MySQL引擎支持事务,比如InnoDB的正常工作,因为它正确地实现事务处理(和语句级读一致性)

MyISAM不支持事务。

+1

@Johan:MySQL中哪个引擎支持事务?我不知道其他人比InnoDB – 2011-04-28 11:57:58

+0

E.g. NDBCluster,BDB – Johan 2011-04-28 12:09:15

+0

我正在使用InnodDB,所以你的意思是第一个查询在本质上是原子的,即在查询完成之前,没有其他人能够读取该表? – Navin 2011-04-29 06:37:41