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文で主キーを指定しているか・いないかで動作は変わりますか?