2011-04-28 69 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