4
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)」です。

4

4 に答える 4

0

あなたのシナリオは、書き込みスキュー異常の例です。使用する分離レベルに応じて、可能な場合と不可能な場合があります。それらはスナップショット分離で可能です。

于 2013-05-08T13:39:16.960 に答える