- PR -

ロックタイムアウトのキャッチ

1
投稿者投稿内容
SK
会議室デビュー日: 2004/08/26
投稿数: 5
投稿日時: 2004-08-26 22:48
現在、C#(Framework 1.0)とSQLServer2000で開発を行っておりまして、SQLServerからロックタイムアウトのエラーが返却された際、これを独自の例外クラスに書き換える処理を行おうとしています。
そこでSqlExceptionでキャッチを行い、エラー番号(Number=1222)でロックタイムアウトか否かを判別しようと考えていたのですが、実際にロックタイムアウトを起こした際に
・Message
「タイムアウトの時間切れです。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません」
・Number
-2
・Class
10
で返却されてしまいます。
SqlExceptionでのキャッチは行われているのですが(InnnerExceptionは無し)、SQL Server Books Onlineを見ても上記に該当するようなエラーもなく、どうキャッチを行えばよいか分からなくなってしまいました。
ロックタイムアウトをキャッチする方法について、ご存知の方がいらっしゃいましたらご教授下さい。

尚、下記がソースの抜粋になります(長文申し訳ございません)

SqlCommand scmd = null;
SqlDataReader sdr = null;
try{
scmd = new SqlCommand("[SQL文]");
scmd.Connection = [コネクション取得処理];
scmd.CommandTimeout = 20;
sdr = scmd.ExcecuteReader();
}
catch(SqlException ex){
if (ex.Number == 1222){
[例外書き換え処理]}
}
finally{[省略]}
SK
会議室デビュー日: 2004/08/26
投稿数: 5
投稿日時: 2004-08-26 23:05
補足です。
実際のロックですが前記ソースの[SQL文]の中で
"SELECT * FROM AAA with (UPDLOCK)"
のような形で行っています。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-08-26 23:40
ほんとうにロックタイムアウトが発生しているの?

.CommandTimeout = 20 ってことは、SET LOCK_TIMEOUT 15 とか
それよりも短いロックタイムアウトを設定しているんだよね?
ロックタイムアウトはどうやって設定してるの?
ちゃんと同じコネクションで設定してる? まずはその辺を確認しないと。
SK
会議室デビュー日: 2004/08/26
投稿数: 5
投稿日時: 2004-08-27 23:02
ロックタイムアウトの設定ですが、SqlCommandの.CommandTimeoutで設定出来ると思っていたのですが、そうではないということでしょうか?
コネクションを確立する時に何か設定が必要ということでしょうか?
申し訳ないですが、詳しく教えて頂けませんでしょうか……。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-08-27 23:35
引用:

SKさんの書き込み (2004-08-27 23:02) より:
ロックタイムアウトの設定ですが、SqlCommandの.CommandTimeoutで設定出来ると思っていたのですが、そうではないということでしょうか?


ロックタイムアウトはDBで発生する事で、SqlCommandの.CommandTimeoutはコマンドの処理を呼び出し側で打ち切る事じゃないですか?
両者の意味の違いが分かりますか?
※と言いつつ、SQL Serverそんなに詳しくないので間違ってるかもしれませんが。
SK
会議室デビュー日: 2004/08/26
投稿数: 5
投稿日時: 2004-08-28 01:16
すみません、お恥ずかしながらコマンドのタイムアウトとロックタイムアウトがごっちゃになっていたようです。
そうしましたら現在返ってきているエラーはロックタイムアウトでなくコマンドのタイムアウトで、.CommandTimeout時間をロックタイムアウト時間より長く設定してやれば(コネクション確立時に設定すれば良いんでしょうか?)正しくロックタイムアウトのエラーが取得出来る、ということになるんでしょうか?
SK
会議室デビュー日: 2004/08/26
投稿数: 5
投稿日時: 2004-08-31 10:43
確認が遅くなってしまいましたが、最初のソースを
SqlCommand scmd = null;
SqlDataReader sdr = null;
try{
scmd = new SqlCommand();
scmd.Connection = [コネクション取得処理];
scmd.CommandText = "SET LOCK_TIMEOUT 15000";
scmd.CommandTimeout = 20;
scmd.ExecuteNonQuery();
scmd.CommandText = "[SQL文]";
sdr = scmd.ExcecuteReader();
}
としまして、Number=1222のロックタイムアウトをキャッチすることが出来ました。
未記入様、なちゃ様どうも有り難うございました。
1

スキルアップ/キャリアアップ(JOB@IT)