C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: SQL Server 2008のロックについて


(過去ログ 105 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■62753 / inTopicNo.1)  SQL Server 2008のロックについて
  
□投稿者/ 焦げ太 (34回)-(2011/10/31(Mon) 21:44:27)

分類:[C#] 

こんばんは。

SQL Server 2008 (R2ではない)を使用しています。
データのロックを掛けたいのですが、思うようにいきません。

(1)テーブルロックを掛けたい

(2)他のトランザクションはSELECTは可能で
   INSERT、UPDATE、DELETEは不可

(3)同一トランザクションは INSERT、UPDATE、DELETEした結果を
   SELECT可能としたい

テーブルロックではないですが「REPEATABLE READ」でよいかと思い
トランザクション開始直後に
「SELECT * FROM tableA WITH (REPEATABLEREAD)」を実行してみた
のですが、ロックされません。

確認方法は上記SQL実行直後にデバッグモードで止めて、
Releaseで作成したほうのEXEを実行してSelectして一覧表示後、
データのInsert処理を行いましたが、Insertできてしまいました。

TABLOCK, UPDLOCK, NOWAIT
TABLOCKX, READCOMMITTED, NOWAIT
UPDLOCK, ROWLOCK, READCOMMITTED, NOWAIT
と組み合わせを試したのですがどれも思うようにいきません。
ご教授いただけると幸いです。

また、「SELECT * FROM tableA WITH (REPEATABLEREAD)」を実行中に
別のトランザクションで「SELECT * FROM tableA WITH (REPEATABLEREAD)」を
実行するとロック中のためエラーになるという認識であっておりますでしょうか?

よろしくお願いします。

引用返信 編集キー/
■62794 / inTopicNo.2)  Re[1]: SQL Server 2008のロックについて
□投稿者/ 焦げ太 (35回)-(2011/11/02(Wed) 19:06:07)
自己解決いたしましたので報告します。

◆ロック時には以下のSQLを発行するようにしました。

set transaction isolation level serializable;
SELECT COUNT(*) FROM [tableName] WITH (XLOCK);

◆SELECT時にはSELECT前に以下のSQLを発行するようにしました。
set transaction isolation level snapshot;

◆SqlCommand.CommandTimeoutを10秒にしました。
CommandTimeoutが300秒になっていたため長い時間
待ち状態となっていたことも混乱の原因の一つでした。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -