SQL Server の トランザクションとロック メモ

● A. トランザクションの分離レベル4種類

非コミット読み取り(READ UNCOMMITTED)
コミット済み読み取り(READ COMMITTED)
再読み込み可能読み取り(REPEATABLE READ)
直列化(SERIALIZABLE)

● A. トランザクションの分離レベル4種類をセットするSQL文

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

● B. トランザクションの開始と終了

・1. トランザクションの開始

トランザクションの開始を宣言します(これがないとロックしません)

BEGIN TRANSACTION

・2. トランザクションのコミット(トランザクション開始からCOMMITまでの処理をすべて実行します)

COMMIT

・3. トランザクションのロールバック(トランザクション開始からCOMMITまでの処理をすべてキャンセルします)

ROLLBACK TRANSACTION

● ロックのタイムアウト

・1. 現在のロックのタイムアウト時間を調べる

デフォルトのロックのタイムアウト時間を調べます

SELECT @@lock_timeout AS default_lock_timeout;

-1 の値が返ってきたときはタイムアウトしません(恐ろしい...)

・2. ロックのタイムアウト時間を設定する

ロックのタイムアウト時間を 30秒 に設定する

SET LOCK_TIMEOUT 30000 

msec で指定するので30秒にセットするときは 30000 になります。

● C. SELECT時に排他ロックをかける

排他ロックは通常 INSERTやUPDATEなどの更新処理のタイミングでかかりはじめます。 SELECTをする時からロックを開始したいときは明示的にロックをかけます

select max(ID) AS maxid from MY_TABLE WITH(XLOCK);

WHERE句が来るときは位置に注意

select * FROM MY_TABLE WITH(XLOCK) WHERE ID = 5 ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT * FROM EV100TL
ROLLBACK TRANSACTION
No.1236
05/25 21:56

edit