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

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

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

Re[5]: SQL Serverでのテーブルロックに関して


(過去ログ 86 を表示中)

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

■51506 / inTopicNo.1)  SQL Serverでのテーブルロックに関して
  
□投稿者/ ことぶき (1回)-(2010/07/07(Wed) 23:05:30)

分類:[データベース全般] 

SQL Server 2008 Expressを使用しています。
今までではOracleをDBに使うことがほとんどでしたが、
今回初めてSQL Serverを使用することになりました。
そのため、理解できていない事がありましたら併せてご指摘いただけると嬉しいです。
OSはWindows XP SP3です。

SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK)
でテーブルロックしたTABLE_Aに対し、

UPDATE TABLE_A WITH(NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
の様に既にロックがかかっていたら即座にエラーを返して欲しいという意図で
NOWAITロックヒントを付けてUPDATE文を発行したところ、ロック待ちが発生しました。
これはSQL Server 2008 Expressの仕様であり回避しようがない事なのでしょうか?
探し方が悪いのかこれが仕様であるとの確証が得られる記述が見つけられません。
また、
>既にロックがかかっていたら即座にエラーを返して欲しい
場合には
SET LOCK_TIMEOUT 0
をトランザクション開始毎に指定するしかないのでしょうか?

「sqlserver テーブルロック」で検索した結果、この問題に似た事象があり参考にしています。
http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/thread/7e6e15d6-2a57-4788-bab8-a96ddff639fa


引用返信 編集キー/
■51511 / inTopicNo.2)  Re[1]: SQL Serverでのテーブルロックに関して
□投稿者/ はつね (1299回)-(2010/07/08(Thu) 09:13:00)
No51506 (ことぶき さん) に返信
> SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK)
> でテーブルロックしたTABLE_Aに対し、
>
> UPDATE TABLE_A WITH(NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
> の様に既にロックがかかっていたら即座にエラーを返して欲しいという意図で
> NOWAITロックヒントを付けてUPDATE文を発行したところ、ロック待ちが発生しました。

WITH(UPDLOCK,ROWLOCK,NOWAIT) でもだめ?(未確認)

引用返信 編集キー/
■51559 / inTopicNo.3)  Re[2]: SQL Serverでのテーブルロックに関して
□投稿者/ ことぶき (2回)-(2010/07/09(Fri) 01:03:12)
No51511 (はつね さん) に返信
> ■No51506 (ことぶき さん) に返信
>>SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK)
>>でテーブルロックしたTABLE_Aに対し、
>>
>>UPDATE TABLE_A WITH(NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
>>の様に既にロックがかかっていたら即座にエラーを返して欲しいという意図で
>>NOWAITロックヒントを付けてUPDATE文を発行したところ、ロック待ちが発生しました。
>
> WITH(UPDLOCK,ROWLOCK,NOWAIT) でもだめ?(未確認)
>
遅くなりすみません。
ご回答ありがとうございます。

> WITH(UPDLOCK,ROWLOCK,NOWAIT) でもだめ?(未確認)
SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK,NOWAIT)
としましたが、変わらずロック待ちが発生しています。

と、ここまで書いて気がついたのですが、ROWLOCKと書かれていますね。
ひょっとしてUPDATE文の方のロックヒントとしてWITH(UPDLOCK,ROWLOCK,NOWAIT)としてはどうか?ということでしたでしょうか?
てっきりSELECT文の方だと思っていましたので、明日改めて確認してみます。


引用返信 編集キー/
■51579 / inTopicNo.4)  Re[3]: SQL Serverでのテーブルロックに関して
□投稿者/ ことぶき (3回)-(2010/07/10(Sat) 01:40:34)
No51559 (ことぶき さん) に返信
> ■No51511 (はつね さん) に返信
>>■No51506 (ことぶき さん) に返信
> >>SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK)
> >>でテーブルロックしたTABLE_Aに対し、
> >>
> >>UPDATE TABLE_A WITH(NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
> >>の様に既にロックがかかっていたら即座にエラーを返して欲しいという意図で
> >>NOWAITロックヒントを付けてUPDATE文を発行したところ、ロック待ちが発生しました。
>>
>>WITH(UPDLOCK,ROWLOCK,NOWAIT) でもだめ?(未確認)
>>
> 遅くなりすみません。
> ご回答ありがとうございます。
>
>>WITH(UPDLOCK,ROWLOCK,NOWAIT) でもだめ?(未確認)
> SELECT * FROM TABLE_A WITH(UPDLOCK,TABLOCK,NOWAIT)
> としましたが、変わらずロック待ちが発生しています。
>
> と、ここまで書いて気がついたのですが、ROWLOCKと書かれていますね。
> ひょっとしてUPDATE文の方のロックヒントとしてWITH(UPDLOCK,ROWLOCK,NOWAIT)としてはどうか?ということでしたでしょうか?
> てっきりSELECT文の方だと思っていましたので、明日改めて確認してみます。
>

遅くなりすみません。

UPDATE TABLE_A WITH(UPDLOCK,ROWLOCK,NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
で確認してみたところ、変わらずロック待ちしてしまいました。

他の情報お持ちの方がいらっしゃいましたら引き続きお願いします。

引用返信 編集キー/
■51596 / inTopicNo.5)  Re[4]: SQL Serverでのテーブルロックに関して
□投稿者/ はつね (1301回)-(2010/07/10(Sat) 23:01:00)
No51579 (ことぶき さん) に返信
> UPDATE TABLE_A WITH(UPDLOCK,ROWLOCK,NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
> で確認してみたところ、変わらずロック待ちしてしまいました。2

ところでこのSQL文はどのようにして発行しているのですか?

引用返信 編集キー/
■51598 / inTopicNo.6)  Re[5]: SQL Serverでのテーブルロックに関して
□投稿者/ ことぶき (4回)-(2010/07/10(Sat) 23:52:59)
No51596 (はつね さん) に返信
> ■No51579 (ことぶき さん) に返信
>>UPDATE TABLE_A WITH(UPDLOCK,ROWLOCK,NOWAIT) SET RECORD_A = 'aaa' WHERE RECORD_B = 1
>>で確認してみたところ、変わらずロック待ちしてしまいました。2
>
> ところでこのSQL文はどのようにして発行しているのですか?
>

ご回答ありがとうございます。
さて、SQL文をどのように発行しているかとのご質問でしたが、
この現象に気付いたきっかけはJavaのJUnitのコードです。
その後はSSMSE(SQL SErverの管理ツール)にて確認しています。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -