Date: Thu, 15 Dec 2005 15:59:28 +0900
From: who@example.co.jp
排他ロック方法に関して質問がございます。
レコード単位に更新ロックをかけたいのですが、
奇妙な動作になってしまいました。
何か間違ってますでしょうか?
少し長文になってしまいますが宜しくお願いします。
【テスト環境&手順】
OSQLでデータベースのテストを行います。
テスト用にテーブルTESTを作成。
レコード5件作成。
[手順1]
全てを表示すると以下のようになります。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1> SELECT * FROM TEST
2> GO
A
------------
5
3
1
2
4
(5件処理されました)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[手順2]
A=1のレコードを行単位に排他ロックで取得。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1> BEGIN TRANSACTION
2> SELECT A FROM TEST
3> WITH (ROWLOCK,UPDLOCK)
4> WHERE A=1
5> GO
A
------------
1
(1件処理されました)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
A=1のレコードはロック中のはずです。
[手順3]
別のOSQLを起動し別プロセスからこのレコードにアクセスしてみます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1> BEGIN TRANSACTION
2> SELECT A FROM TEST
3> WITH (ROWLOCK,UPDLOCK)
4> WHERE A=1
5> GO
メッセージ 1222、レベル16、状態50、サーバー MSDE_SERBER、行4
ロック要求がタイムアウトしました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
※LOCK_TIMEOUTは0にしすぐにタイムアウトするようにしています。
思惑通りです。
[手順4]
同じように今度は別レコードを取得します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1> BEGIN TRANSACTION
2> SELECT A FROM TEST
3> WITH (ROWLOCK,UPDLOCK)
4> WHERE A=4
5> GO
メッセージ 1222、レベル16、状態50、サーバー MSDE_SERBER、行4
ロック要求がタイムアウトしました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
なぜかROWLOCKを指定しているのにも関わらずロックされています!
別のレコードもやってみます。
[手順5]
A=5のレコードを取得します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1> BEGIN TRANSACTION
2> SELECT A FROM TEST
3> WITH (ROWLOCK,UPDLOCK)
4> WHERE A=5
5> GO
A
------------
5
メッセージ 1222、レベル16、状態50、サーバー MSDE_SERBER、行4
ロック要求がタイムアウトしました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
レコードが取れています。そしてタイムアウトのメッセージも
きています。
どうやら、ロックされているレコード行(A=1)よりも
手順1で取得したレコード順で見て、後ろにあるレコードの
場合は手順4の動作、前にあるレコードの場合は手順5の動作を
するようです。
レコード単位でロックしたいのですが、何か間違っていますでしょうか?
宜しくお願いします。
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|