SQL Serverデータベースで作業を開始しましたが、Transaction Isolation Levels
を理解しようとするのは苦労しています。トランザクション中にデータがロックされる方法
私は次のような単純なタスクaccomlishしようとしています:IDは、特定のテーブルに存在するかどうかを判断するSQLストアドプロシージャ
- [ID、カウンター]整数のペアを受け入れた:
SELCT COUNT(*) FROM MyTable WHERE Id = {idParam}
- 以前
COUNT
ステートメントが0を返す場合、このIDとカウンターを挿入:COUNT
文が1を返す場合INSERT INTO MyTable(Id, Counter) VALUES({idParam}, {counterParam})
- は、既存のレコードを更新:を(
は今、私はトランザクションでこの全体のストアドプロシージャをラップする必要が理解し、そしてthis MS articleに応じて適切な分離レベルはSERIALIZABLE
だろう、それは言う:他のトランザクションはによって読み取られたデータを変更することはできません現在のトランザクションが完了するまで)。私がここで間違っているなら、私を修正してください。
ID = 1のプロシージャを呼び出すと、最初のクエリはSELCT COUNT(*) FROM MyTable WHERE SomeId=1
(最初のトランザクションが開始された)になります。次に、このクエリが実行された直後に、ID = 2(2番目のトランザクションが開始された)でプロシージャが呼び出されます。これはその第一の意味は、
- 第一トランザクションの第一クエリが0のレコードを返した場合:私は理解できないのは何
は、この場合の私のストアド・プロシージャの実行中にロックされるだろうどのくらいのデータであり、トランザクションは何もロックせず、他のトランザクションは1回目のトランザクションがそれを試行する前にID = 1をINSERTできますか?
- 2番目のトランザクションが同じ行の読み取り/更新を試みることは決してできませんが、最初のトランザクションはテーブル全体をロックしますか?
- また、1番目のトランザクションでは、ID = 1のレコードのみを読み書きすることを禁じられていますか?
私はいつも同じIDでprocを呼び出し、重複するインデックスを挿入して、毎回挿入エラーを起こそうとします - これは本当に速くなるでしょうか? – holdenmcgrohen
@holdenmcgrohenはい、非常に高速です。ユニークなインデックスチェック*は速くなければなりません。しかし、プロファイリングは常にあなたの友人です:)いずれにしても、私はOPのケースがクライアント - >サーバーI/Oによって完全に支配されると思います。 – Luaan