二つのテーブルがあります。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になることはありません。
提案/フィードバック。
@Johan:MySQLの他のエンジンがトランザクションをサポートしていますか?私はInnoDB以外のことを知らない。 –
例えば、 NDBCluster、BDB – Johan
InnodDBを使用していますので、最初のクエリは本質的にアトミックです。つまり、クエリが完了するまで誰もそのテーブルを読み取ることができません。 – Navin