- - PR -
ロックについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-08-30 19:39
SQLServer2005にて知識不足で理解できない点があります。
みなさんのお力をお借りしたく書き込みさせて頂きます。 よろしくお願い致します。 現在、SQLServer2005にて、あるSP_Aというストアドプロシージャーを作成しました。 SP_Aの簡単な内容は、 TBL_1をINSERTし、 TBL_1のデータを元にTBL_2をUPDATEする ようなストアドプロシージャーです。 また、TBL_2に対してトリガーを埋め込み、 TBL_2がINSERTまたは、UPDATEされると自動的に TBL_2をさらに更新する仕組みになっています。 現在、SP_AはVB.netのPGより起動されます。 SP_AがVB.netより起動し、処理中の間、 クエリーよりTBL_1または、TBL_2に対して、 更新系のSQL(Insert,Update,Delete)を投げかけると 待ち状態になってしまいます。 SP_Aにて処理しないKEYに対してのSQLなのですが、TBLロックが かかってしまっているのか、待ち状態になってしまいます。 DBのトランザクションレベルはREAD_COMMITTEDのSNAPSHOT=ONです。 何故か、SP_AをVBからの起動でなく、クエリーより起動した場合は、 TBL_1またはTBL_2に対する別KEYの更新処理は待ち状態にならずに 思い通り動いてくれます。 VBでもトランザクションレベルはREAD_COMMITTEDで指定しているはずなのですが、 何が違いがあるのでしょうか? 何かこれが原因ではないか?っていう意見を何でもいいんで 聞かせて下さい。 長々とすみませんが、よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2007-09-13 11:06
自己解決できました。
ロックエスカレーションが起こっている模様です。 大量件数処理すると、SQLServerが自動的にロックエスカレーションってのを 起こすみたいで、こいつにより、行ロックがページロック、テーブルロックに 自動的に変更されているらしいです。 | ||||||||||||
|
投稿日時: 2007-09-13 12:51
無事解決したようで、良かったですね。
この理由も解決しましたか? もしかして、VBで起動した時とクエリーより起動した時の条件 (プロシージャの呼び出し回数とかパラメータとか)が違ったのでしょうか? | ||||||||||||
|
投稿日時: 2007-09-13 14:47
SQL Sever と言えば何でもかんでもロックエスカレーションのせいにして解決される事がしばしばですが、もう少し原因を追求した方が良いと思いますよ。
まぁ待ち状態になるだけで特に困っていないなら、素直に待つべきですが。
「処理しないKEY」かどうかは、先の SP_A のトランザクションが終わってみないと、次のトランザクションには分からないので待つのは当然です。Update や Delete の対象となるレコードを探すのにテーブルをスキャンしないとダメですよね。 http://www.microsoft.com/japan/sql/ssj/tips/02.mspx
用語は正しく使わないと正確に人に伝わらないですよ。 「トランザクションの分離レベルはREAD_COMMITTED」で、「READ_COMMITTED_SNAPSHOT なのか スナップショット分離レベルなのか」どっちでしょう? まぁここでは関係ないでしょうけど。
単に先のトランザクションが終わってしまったからでは? _________________ 囚人のジレンマな日々 |
1