行をロックし、それを選択し、その値を増分して、ロックを解除できるようにしたいのですが。 (他の行をロックインせずに、他の接続が残りのテーブルで機能できるようにする)
私は見つけた this
BEGIN TRAN SELECT * FROM tablename WITH (HOLDLOCK, ROWLOCK)
WHERE ID = 1
私の問題は私ができないことです
UPDATE tablename
SET columnName = -1
WHERE ID = 2
以前のトランザクションをコミットするまで、行ロックがテーブル全体をロックするのはなぜですか?
edit:
このコードは、選択した行のデータがこの更新コマンド中に更新されないことを保証しますか?
UPDATE [tablename] WITH (ROWLOCK)
SET columnName = columnName + 5
WHERE ID = 1
編集に基づいて、すべての書き込みは排他的にロックされます。
他のプロセスは、書き込まれていない行を読み取ることができません。
通常、日々のコードにロックヒントを追加する必要はありません。
(どうやら)テーブルロックを持っている理由については、IDにインデックスがないことが原因である可能性があります。すべての行を確認する必要があるため、テーブルがロックされています。
ROWLOCK
はテーブルをロックしていませんが、TRANSACTION
はロックしています。
同じトランザクション内から更新を実行できるはずです。別のセッションからUPDATE
を実行しようとすると、機能しません。