2011-04-28 4 views
9

二つのテーブルがあります。MySQLクエリはサブクエリを含んでいますか?

表1のユニークなセッション

ID Count 

表2(セッション)

ID Name 

私はnameが存在しない場合にのみ、countを更新したいと思いますユニークなセッション数をカウントするためのセッションに変換する方法ですが、これは別の方法で行うのではなく、スティーンは:

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

これは、使用しているストレージエンジンによって異なります。

それが正しくトランザクションハンドリング(と文レベルの読取り一貫性)を実装するとあなたの例では、唯一のInnoDBのようなトランザクションをサポートMySQLのエンジンで正しく動作します

のMyISAMはトランザクションをサポートしていません。

+1

@Johan:MySQLの他のエンジンがトランザクションをサポートしていますか?私はInnoDB以外のことを知らない。 –

+0

例えば、 NDBCluster、BDB – Johan

+0

InnodDBを使用していますので、最初のクエリは本質的にアトミックです。つまり、クエリが完了するまで誰もそのテーブルを読み取ることができません。 – Navin

関連する問題