INSERT INTO T1 (xField) SELECT 7 AS xField WHERE (SELECT COUNT(*) FROM T1) = 0
基本的に、100 万人のユーザーがすべて同時にこれを実行した場合、T1 に複数の行が存在する可能性はありますか?
Thread A: SELECT COUNT(*) FROM T1: 0
Thread B: SELECT COUNT(*) FROM T1: 0
Thread A: INSERT INTO T1...
Thread B: INSERT INTO T1...
それとも、すべて 1 つのステートメントであるため、絶対に起こらないことが保証されていますか?
それが安全でない場合、このようなものはどうですか?
表 T2 (GoNorth と GoSouth の両方が 1 であってはなりません):
ID GoNorth GoSouth
1 0 0
次に、これが起こります:
User A: UPDATE T2 SET GoNorth = 1 WHERE GoSouth = 0
User B: UPDATE T2 SET GoSouth = 1 WHERE GoNorth = 0
Thread A: Find rows where GoSouth = 0
Thread B: Find rows where GoNorth = 0
Thread A: Found a row where GoSouth = 0
Thread B: Found a row where GoNorth = 0
Thread A: Setting GoNorth = 1 for the located row
Thread B: Setting GoSouth = 1 for the located row
そして結果:
ID GoNorth GoSouth
1 1 1
同時に何が起こり、何が起こり得ないかについてのルールは何ですか?
私のデータベース エンジンは「Microsoft SQL Server 2008 R2 (SP2)」です。