2016-08-22 8 views
1

2つの異なるテーブルに2つの行を挿入したいが、2番目のテーブルのいくつかの事前条件が満たされている場合は、トランザクションをロールバックしたい。MSSQLを正しくロックして挿入する方法は?

.NETでトランザクションスコープを開始し、insert文を実行する前に2番目のテーブルのデータをチェックするSQLクエリを実行するだけで動作しますか?その場合、使用する分離レベルは何ですか?

多くのインサートが存在するため、テーブル全体をロックしたくありません。私がやりたいこと(表1のPK列にFK)同じ値を持つように第二の表の2以下の行を保証するものであるため、UNIQUE制約は

おかげ

答えて

0

オプションはいあなたがすることができませんinsert文を実行する前に2番目のテーブルのデータをチェックするためにsqlクエリを実行します。

FyiデフォルトはSerializableです。 MSDNから:

最低の分離レベル、READUNCOMMITTED、多くのトランザクション が同時にデータ・ストア上で動作することを可能に起因割込取引データ破損に対する保護 を提供しません。最高の 分離レベルであるSerializableは、中断トランザクションに対して高い保護度を提供しますが、他のトランザクションが データで動作する前に、各トランザクションが完了することを必要とします( )。

トランザクションが作成されると、トランザクションの分離レベルが決定されます。既定では、System.Transactions インフラストラクチャはシリアライズ可能なトランザクションを作成します。トランザクションの IsolationLevelプロパティを使用して、既存のトランザクションの分離レベルを と判断できます。

大量のマルチユーザーシステムでは、ブロックされる可能性が最も高いので、シリアライズドを使用したいとは思っていません。

必要な保護の量を決定する必要があります。最低でも、READ COMMUNCED、READ COMMITTED、REPEATABLE READを調べてください。以下の答えは、隔離レベルを詳しく説明しています。それで、どのレベルの保護があなたの要求に十分であるかを決めることができます。

Transaction isolation levels relation with locks on table

関連する問題