- - PR -
SQLServer2000の排他ロックタイミングについて
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-08 10:23
お世話になります。
SQLServer2000において、排他ロックのデッドロック回避策について、お力添えを承りたく存じます。 現状は ************************** サーバー機 Windows2003ServerSP1 SQLServer2000SP4 ************************** の環境にて、クライアント端末からSQLを発行しております。 しかし、下記手順にて実行するとデッドロックが発生してしまい、その回避策を模索しております。 @端末Aを利用 A分散トランザクションレベルをReadUnCommittedに指定 Bトランザクションを開始 Cテーブルαに対して、Insert文を発行 D端末Bを利用し、テーブルαのSelect文を発行 E再度、端末Aを利用し、テーブルαに対して、Insert文を発行 この場合、Dの段階でブロッキングが発生し、Eの段階でタイムアウトエラーとなってしまいます。 ReadUnCommittedを用いた場合、参照クエリの排他ロックはSQLServerの仕様上ないはずですが、実際は発生するようです。 冗長な内容となってしまいましたが、何卒宜しくお願い致します。 | ||||||||||||
|
投稿日時: 2006-08-08 12:32
何がロックされているのかを Enterprise Manager なり何なりで参照してみてはどうでしょうか。
_________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-08-08 12:40
端末Bから発行されるSelect文のトランザクション分離レベルもReadUnCommittedになっているのでしょうか。
| ||||||||||||
|
投稿日時: 2006-08-08 13:01
囚人様 minminnana様 お世話になっております。 早々のご返答ありがとうございます。 ------------------------------------------------------- 【1】 ------------------------------------------------------- >何がロックされているのかを Enterprise Manager なり何なりで参照してみてはどうで>しょうか。 ------------------------------------------------------- 【2】 ------------------------------------------------------- >端末Bから発行されるSelect文のトランザクション分離レベルもReadUnCommittedにな >っているのでしょうか。 上記二点に関しまして まとめてお答えさせて頂きます。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 実は、Enterprise Manager の現在の利用状況にてロックオブジェクト 及びロックプロセスを確認しながらの確認作業をおこなっております。 それによると DSelect文を実行したタイミングで排他(IX)にロック種類が切り替わり、デッドロックが発生いたします。 そして、EのInsertのタイミングにてタイムアウトが発生いたします。 たとえば、 DSelect文にNoLockなどのロックHintを設定し実行すると デッドロック自体起こりえないのですが、DSelect文はマージレプリケーション の同期プロセス内での自動実行により発行されるSqlなのです。 マージレプリケーションの同期を実行しているストアド自体にロックヒントを 設定できれば何も問題ないのですが、Microsoftに問合せを行ったところ マージレプリケーションの同期プロセス内のストアドを変更することはできない そうなのです。 そこで他の何らかの設定にて、この現象を回避したいのですが 例えばSqlServerのデフォルトロックレベルを変更し、マージレプリケーション の同期トランザクションレベルを設定する方法など 何か良い方法をご存知ではないでしょうか。 [ メッセージ編集済み 編集者: kaki@ 編集日時 2006-08-08 13:05 ] | ||||||||||||
|
投稿日時: 2006-08-08 16:30
通常は整合性を保つためにそれが必要だから排他が掛かるものと思うのですが、とにかく更新が掛かれば問題ないという事なのでしょうか。 タイムアウトが発生するほど排他が長引くレプリケーションの方に問題があるわけではありませんか? | ||||||||||||
|
投稿日時: 2006-08-08 16:41
上記件、ご回答ありがとうございます。 >通常は整合性を保つためにそれが必要だから排他が掛かる その通りです。 ただ今回の場合、SqlServer側で予期せぬ排他ロックを獲得してしまい 困っております。 >とにかく更新が掛かれば問題ないという事なのでしょうか。 とにかく、更新(Insert)が掛かれば問題はありません。 >タイムアウトが発生するほど排他が長引くレプリケーションの方に問題があるわけでは>ありませんか? 上記件に関しまして、 レプリケーションは排他処理自体は行っておりません。 マージレプリケーションの同期処理内のSelect文をトリガーとして 自身トランザクションの排他がおこなわれてしまいます。 よって以下となります。
[ メッセージ編集済み 編集者: kaki@ 編集日時 2006-08-08 16:44 ] | ||||||||||||
|
投稿日時: 2006-08-08 16:46
確かにマージレプリケーションの同期を実行している
内部的なトリガ、及び内部的なストアドのロックレベルは設定出来ない。 及びロックヒントも設定が出来ないと聞いたことがあります。 | ||||||||||||
|
投稿日時: 2006-08-08 16:58
Mako 様
早速のご回答ありがとうございます。
そうですね、 Microsoftの担当者もそれがSQLServer2000の仕様であるとおっしゃってました。 その為なのか、この件に関する資料が非常に乏しく、 お恥ずかしながら、難航している状況というところです。 改めまして、お力添えをお願い申し上げます。 [ メッセージ編集済み 編集者: kaki@ 編集日時 2006-08-08 17:00 ] |