- - PR -
DBへの排他制御の方法について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-24 16:23
ん?一応念のために
と言うSQLで更新していると言う事ですよね?この方法なら、データ取得時以降、データを更新するまでの間に、誰かにレコードを更新されているなら、必ず検出できます。もちろんルールを守らないソフトウェアがいたら、駄目ですけどね。 もしも取得(SELECT)して、比較(IF 〜)して、更新(UPDATE)していると言うことなら、それは楽観的なロックにすらなっていません。
いや、別に間違っていないと思いますよ。これもlockの一つですから。 | ||||||||||||
|
投稿日時: 2006-05-24 16:24
こんにちは。
書いて更新してみたらみなさんが書き込みされている…はっ!これが楽観的ロック!
さかもとさんがおっしゃっているのは『項目を比較して』ということなので、更新日付を比 較することも含まれているかと思います。楽観的ロックの場合は比較的よく使われる手 法だと思います。 で、それが排他制御か否かといわれると、広義では排他制御と言えるかも知れないけ れど、あまりそれを指して排他制御とは言わないので誤解される可能性もあるかも、と 思います。 # と思ったらさかもとさん本人からツッコミが入っていましたね。 楽観的ロックの説明はこの辺をご覧になっているのだと思いますが、むしろ大西彰さんの このあたりの説明の方がわかりやすいかな、と思いました。
節子!それライブラリ違う! とかいうツッコミはナシでしょうか・・・ | ||||||||||||
|
投稿日時: 2006-05-24 16:26
実際には
if 1 = 1 then という条件文では無かったのですが。。 確か Dim a As string() = {"1","2","3","4"} Dim b As string = "1" if a(0) = b then みたいな文だったのですが。。 " = " で比較するとうまく判断できないのですが、 " equals " で判断させると思ったとおりの処理をする。。みたいな その時の現場の人全員に相談したんですが、ありえねぇぇーーー ってことで結局、しょうがないので" equals "を使った記憶があります。。 | ||||||||||||
|
投稿日時: 2006-05-24 16:56
えっ('▽';;;; ちょっ・・・ マジっすか 思い切り取得(SELECT)して、 コード(C#等の)上で比較(IF 〜)して、 更新(UPDATE) してました。。。 ちなみにそうした場合ってどうやって更新されたかそうでないかを取得するのでしょうか?
寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw | ||||||||||||
|
投稿日時: 2006-05-24 17:04
たいてい人のせいにするやつこそ。 まず自分を疑うべきだ。 〜普通レベル以上のプログラマ全員からの言葉〜 | ||||||||||||
|
投稿日時: 2006-05-24 17:07
> 思い切り取得(SELECT)して、
> コード(C#等の)上で比較(IF 〜)して、 このタイミングで他の人が更新する可能性がありますね。 > 更新(UPDATE) > ちなみにそうした場合ってどうやって更新されたかそうでないかを取得するのでしょうか? 最初にデータを取り出したときにもともとの更新日付も一緒に 取り出しておいて、そのデータと現在のデータが同じかどうかを where句で判断して同じであれば更新、ということですね。 #甕星さんの書いてる通りですが。 > 寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw じゃ、.NETでの開発はしない、ということで(w | ||||||||||||
|
投稿日時: 2006-05-24 17:18
そうですよね〜 そこでどういうロックの方法があるのかな〜?っと思ったわけです。
つまり、WHERE句に条件を書いてUPDATE文を走らせた後 SELECT句で更新を確認する。。ということでしょうか?
VSのIDEは好きなんですけどねぇ。。。 願わくば.NETで開発しない その方向性でw ちなみに ぶさいくろうさん デバッグモードで値を確認してみても、 a(0) | "1" string b | "1" string とかだったのですが。。 どうしろと? | ||||||||||||
|
投稿日時: 2006-05-24 17:20
String の比較のときは NULL でも入っていない限り まず "=" でも問題ないと思いますけれどね
いや、Ifとかは制御文であってライブラリじゃないですから |