web-dev-qa-db-ja.com

使用中に行をロックする方法

行をロックし、それを選択し、その値を増分して、ロックを解除できるようにしたいのですが。 (他の行をロックインせずに、他の接続が残りのテーブルで機能できるようにする)

私は見つけた 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
6
RagnaRock

編集に基づいて、すべての書き込みは排他的にロックされます。

他のプロセスは、書き込まれていない行を読み取ることができません。

  • あなたはばかげていて、NOLOCKを使用しています
  • 最後にコミットされた行が読み取られるスナップショット分離がある

通常、日々のコードにロックヒントを追加する必要はありません。

(どうやら)テーブルロックを持っている理由については、IDにインデックスがないことが原因である可能性があります。すべての行を確認する必要があるため、テーブルがロックされています。

6
gbn

ROWLOCKはテーブルをロックしていませんが、TRANSACTIONはロックしています。

同じトランザクション内から更新を実行できるはずです。別のセッションからUPDATEを実行しようとすると、機能しません。

1
JNK