SQL Serverの各SELECT
ステートメントは、共有ロックまたはキーロックのいずれかが配置されると考えています。しかし、それがトランザクションのときに同じタイプのロックを配置するのだろうか?共有キーまたはキーロックにより、他のプロセスが同じレコードを読み取ることができますか?例えばSQL Serverのトランザクション内でSELECTステートメントにどのような種類のロックが設定されているか
Iこの時点で、次のロジック
Begin Trans
-- select data that is needed for the next 2 statements
SELECT * FROM table1 where id = 1000; -- Assuming this returns 10, 20, 30
insert data that was read from the first query
INSERT INTO table2 (a,b,c) VALUES(10, 20, 30);
-- update table 3 with data found in the first query
UPDATE table3
SET d = 10,
e = 20,
f = 30;
COMMIT;
は私のselect文はまだ共有やキーロックを作成するか、それが排他ロックにエスカレートれますか?他のトランザクションは、テーブル1からレコードを読み取ることができますか、他のトランザクションが選択できるようになる前に、自分のトランザクションがコミットされるまで、すべてのトランザクションは待機しますか?
アプリケーションでは、トランザクションの外でselect文を移動して、挿入/更新を1つのトランザクションに保持するためです。
この貴重な情報をありがとうございました。したがって、SQL Serverが任意のselectステートメントに対してデフォルトで 'Read Committed'を使用している場合です。トランザクションの外でSELECTクエリを分離しようとしたためではありません。 –
@MikeA:いいえ、違いはありません - 共有ロックは、実際にはデータを読み取る*ためにちょっとだけ取得されます。あなたがそれらを読んでいる間にそれらを変える)、そしてそれらは再び解放されるでしょう - その取引の内側または外側 - 同じプロセス –
あなたがこれに気付かない場合:READ COMMITTEDは常にロックしないことを選択します。ロックはコミットされていない変更が加えられたページでのみ行われます。あなたはXLOCKであったRCの下のテーブルを読むことができ、別のトランザクションによってTABLOCKされたテーブルを読むことができます。 (私はそれを試しました) – usr