SQL Server で 2 ステップの挿入を実行しているときに、テーブルを排他的にロックするために何をする必要があるかを調べるために、トランザクションの分離レベルとテーブル ヒントに関する MSDN を読んでいます。私はそれを行う2つの方法を思いついたので、アプローチの違いを知りたいです。
この回答は、ヒントを使用してそれを行う方法を示しています ( https://stackoverflow.com/a/23759307/545430 ):
--Enclose steps in transaction to define an atomic operation
BEGIN TRAN
-- Perform an insert that locks tblMoo
INSERT INTO tblMoo SET fldCow='valPie' WITH (TABLOCKX, SERIALIZABLE)
UPDATE tblMoo SET fldCowIndex=(SELECT MAX(fldCowIndex) + 1)
COMMIT TRAN
分離レベルを設定することで、目的を達成することもできると思います。
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
INSERT blah blah blah
UPDATE hoo dee dah
COMMIT TRAN
トランザクションがこの新しい行を挿入している間、すべての更新からテーブル全体をロックすることが重要です。両方のアプローチで同じ結果が得られるでしょうか? テーブルは INSERT コマンドと UPDATE コマンドの両方でロックされていますか?