- PR -

SQL Server の排他ロックに関して(SELECT)

投稿者投稿内容
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-04-16 14:17
引用:

分離レベルに関してはフレームワークで保証しているので大丈夫なのです。


with (READUNCOMMITTED) や with (NOLOCK)が指定されても?

引用:

最初の問題に戻りますが、
ロックヒントをXLOCKにしたところ、
他のトランザクションからの通常のSELECT文はロックしたのですが
最初にロックしたSQLと同じ様に、ロックヒントを指定してSELECTすると、
トランザクションをコミットする前に、別トランザクションからでも
SELECTできてしまうのです。


ありえません。

ロックヒントを指定したときとそうでないときで、
SQLServerの処理が違うの当然です。
でも、タイミングが違うだけで結果は同じです。

reader2 = command2.ExecuteReader(); // ※ここで取得できないようにしたい!!!!
reader2.Read(); //これを追加

で確認してみて下さい。

BooksOnlineはもちろん、
.NETエンタープライズ Webアプリケーション開発技術大全 Vol.5
トランザクション設計編に分かりやすく解説されています。
(分かりやすくは主観です)
こんどる
常連さん
会議室デビュー日: 2004/05/10
投稿数: 30
投稿日時: 2005-04-17 16:49
nanbuさんへ

引用:
with (READUNCOMMITTED) や with (NOLOCK)が指定されても?


詳細な説明は省きますが、SQLに関してはF/Wで様々な制御がされており、このような指定はできないように制御しているので大丈夫です。
いろいろ有難うございました。
本題のほうですが、結論として以下のような勘違いでした。申し訳ないです。


未記入さんへ

引用:
「ようです」じゃなくて、ちゃんと SET LOCK_TIMEOUT について BooksOnline で調べたらどう?


「ようです」というのは別にSET LOCK_TIMEOUT自体に関してではなく、動作に関して述べただけです。SET LOCK_TIMEOUTに関して調べてないわけでも認識不足なわけでもありません。ただちょっと混乱してよくわからない書き方をしてしまいました。

引用:
取得というのはどうやって確認したの? ロックタイムアウトになって取得せずに制御が戻っただけじゃないの?


その通りでした。
取得確認方法ですが、LOCKOUTを指定しない場合にSqlCommandのExceptionをキャッチしていたのですが、
LOCKOUTを指定した場合にExceptionが発生しないので、取得できてしまっていると勘違いし、混乱してしまっていました。

引用:
前提となるあなたの基礎知識が足りなすぎるようなので、悪いけど、これ以上は説明する気にもなれない。


あまりこういうことを言いたくはないですが、特にあなたが説明する気になれるかどうかを書いていただく必要はないです。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-04-17 18:45
引用:
SET LOCK_TIMEOUTに関して調べてないわけでも認識不足なわけでもありません。


認識不足でしょう。ちゃんとロックタイムアウトについて理解しているなら↓こんな発言は出てこない。

引用:
タイムアウト時間を1000に設定していますがこの場合、別トランザクションから取得するときに、1秒待ってから取得するようです。


それと、認識が足りない・おかしいのはロックタイムアウトに関する点だけではない。排他ロックについても十分に理解できていないから、適切な確認方法が取れずに変な勘違いをするんだよ。普通は機能を知っていて結果でそれを確認するものだけど、あなたの行動は「結果を見て機能を推測している」ように思える。

引用:
あまりこういうことを言いたくはないですが、特にあなたが説明する気になれるかどうかを書いていただく必要はないです。


言いたくないなら言わなければいいのに。結局のところ「言い返さずにはいられない」んでしょ。本当に恥ずかしい人だなあ。
こんどる
常連さん
会議室デビュー日: 2004/05/10
投稿数: 30
投稿日時: 2005-04-17 21:16
引用:
認識不足でしょう。ちゃんとロックタイムアウトについて理解しているなら↓こんな発言は出てこない。


だから、認識はあっていたのですが、取得していると勘違いしていたために混乱して、自分の認識が間違っていたのかなと思ったんですよ。
別に言い訳するほどのことではないですが、言い方が腹立ったので言い返してみました。

引用:
それと、認識が足りない・おかしいのはロックタイムアウトに関する点だけではない。排他ロックについても十分に理解できていないから、適切な確認方法が取れずに変な勘違いをするんだよ。


これについては、別に認識が正しいなんて言った覚えはないです。
いろんなサイトを見ていろんな記述があって良く分からなくなったので、質問したまでです。

引用:
言いたくないなら言わなければいいのに。結局のところ「言い返さずにはいられない」んでしょ。本当に恥ずかしい人だなあ。


本来なら言いたくないけど、言われたから言い返したまでです。
顔が見えないからって挑戦的な書き方をするあなたの方が恥ずかしいと思いますが?
まあこんなことを書いてしまった私も同レベルですが。

と、こんなことを言い合う場ではないので、これで止めておきます。

結果的に解決することができました。
お二人ともありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-18 23:44
引用:

こんどるさんの書き込み (2005-04-17 21:16) より:


 もう見てないかもしれないけど。
 言葉の是非はともかく、未記入氏の指摘事項は、真摯に受け止めた方がいいよ。nanbuさんとのやりとりにしても、伝えるべきことを伝えず、誤解させているわけだし。

 自分を正しく伝えることができない、ということは、いろいろなところで損をします。たとえば、プレゼンテーション。「これくらいはわかってくれるだろう」と思って省いたことで、失敗することもあり得ます。

 今回のことは、あなたがわかっているつもりで、わかっていなかったことが原因なんだし。

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