• 締切済み

DBの行ロックの挙動について教えてください。

行ロックの挙動について教えてください。 (SQLサーバ、トランザクション分離レベル READ COMMITTED) 行ロックをかけるとロックが掛かった行は他端末から更新・削除などが出来なくなると思います。 逆に言うとロックがかかっていないデータは挿入・更新・削除は自由にできると思っていたのですが、 ロック対象データとは関係ないデータの挿入ができません。そういうものなのでしょうか? ■端末1がロックをかけたデータを端末2が更新する場合 端末1:SELECT * FROM AAA WITH(XLOCK,ROWLOCK) WHERE ID=1 端末2:UPDATE AAA SET ABC='123' WHERE ID=1 ←☆☆端末1がロックかけているので待ち状態になる☆☆ ■端末1がロックをかけたデータを端末2が削除する場合 端末1:SELECT * FROM AAA WITH(XLOCK,ROWLOCK) WHERE ID=1 端末2:DELETE AAA WHERE ID = 1 ←☆☆端末1がロックかけているので待ち状態になる☆☆ ■端末1がロックをかけたデータとは関係ないデータを端末2が挿入する場合 端末1:SELECT * FROM AAA WITH(XLOCK,ROWLOCK) WHERE ID=1 端末2:INSERT INTO AAA (ID,ABC) VALUES (2,'456') ←★★何故か待ち状態になる(そういうもの?)★★ ■端末1がロックをかけたデータとは関係ないデータを端末2が更新する場合 端末1:SELECT * FROM AAA WITH(XLOCK,ROWLOCK) WHERE ID=1 端末2:UPDATE AAA SET ABC='123' WHERE ID=2 ←☆☆端末1がロックをかけていないので更新できる☆☆ ■端末1がロックをかけたデータとは関係ないデータを端末2が削除する場合 端末1:SELECT * FROM AAA WITH(XLOCK,ROWLOCK) WHERE ID=1 端末2:DELETE AAA WHERE ID = 2 ←☆☆端末1がロックをかけていないので削除できる☆☆ 上記のSQL文は説明のため簡素化しています。実際にはWHERE句に主キー以外を指定したりしています。 ロックをかけるSQL文で主キーを指定しているか・いないかで動作は変わりますか?

みんなの回答

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.2

>テーブル ヒント (Transact-SQL) - SQL Server | Microsoft Learn >https://learn.microsoft.com/ja-jp/sql/t-sql/queries/hints-transact-sql-table こちらのページの注釈に、次の記述がありました。 >行レベルのロックを獲得するロック ヒント ROWLOCK、UPDLOCK、XLOCK では、 >実際のデータ行ではなくインデックス キーに対してロックが実行される場合があります。 SELECT の書き方により、インデックスがロックされる場合があるとのことで、インデックスがロックされたなら、UPDATE はできても INSERT 出来ないことになるのかもしれません。 まあつまり結局回答No.1さんと同じことを言っている気がします(汗

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.1

INSERTだからかもしれませんね。 ユニークインデックスが絡むと、ロックされている行の処理とダブる可能性を考えて排他制御の対象になっているのではないでしょうか。

関連するQ&A