Date: Thu, 29 Jun 2006 18:36:48 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です、こんにちは
-----Original Message-----
From: "堀江" "正浩" [mailto:who@example.ne.jp]
Sent: Tuesday, June 27, 2006 7:30 AM
To: who@example.ne.jp
Subject: [ml-msde-beg:01835] 排他ロックについて
>排他ロックについて、教えていただければと思います。
レコードの排他ロックは、データを更新するときに使われるものです
update,insert,deleteなどの更新系命令がデータを更新するときに
レコードの排他ロックを掛けて、そのトランザクションが終了するまで保持します。
レコードの排他ロックが掛かっているレコードは、読み出すことはできません。
質問の主旨は、トランザクションの中のSELECTで取得している
レコードを、他のトランザクションのSELECTから見えないように
(読み取れない)したい内容ですね
一番簡単にできる方法は、WITH(XLOCK,PAGLOCK) のページ排他ロックを
使って、読み込んでいるレコードのページを排他ロックすれば、他からその
レコードを読み取ることはできません。
XLOCKは、ページまたはテーブルと組み合わせて使います。
テーブル排他ロック(TABLOCKX)を使えば、テーブルがロックされます。
SELECT命令で、何かレコードの読み込みをお互い阻止し合うのであれば、
アプリケーションロックを使う方法があります。
排他ロックを掛ける
exec sp_getapplock '適当に付けた名前' , 'Exclusive'
排他ロックを開放する
exec sp_releaseapplock 'sp_getapplockで付けた同じ名前'
で制御して下さい
あるいは、排他制御用のダミーのテーブルを用意して、そのテーブルの
レコードを更新することによって、トランザクション終了まで排他ロックが
維持できます。
トランザクション−A
begin tran
ダミーのテーブルのレコードを更新する
SELECT 命令
commit tran
トランザクション−B
begin tran
Aとまったく同じ、ダミーのテーブルのレコードを更新する
SELECT 命令
commit tran
最初にレコードを更新したトランザクションのSELECTは、すぐに実行できる
アプリケーションロック用のストアドを使うより、ダミーのテーブルを使うほうが
間違いが無くてよいでしょう
------------------------------------
Epata-IT/日本技術ソフト開発
堀川 明 (Akira Horikawa)
06月29日(木曜日) 18時35分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|