- PR -

DBへの排他制御の方法について

投稿者投稿内容
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-05-24 16:23
引用:

なせさんの書き込み (2006-05-24 15:56) より:
各項目を見て、その項目が更新されていなければ更新しない。
という意味で仰っているのでしょうか。。。?
そういう意味でしたら違います。
全テーブルの項目に更新日付という列を持っています。
DB更新の際には、必ず更新日付を見に行って、
更新日付が変更されていなければ、更新。
更新日付が変更されていれば、更新しない。


ん?一応念のために
コード:
UPDATE テーブル名 SET フィールド名 = {値}, 更新日付 = {現在時刻}
WHERE 更新日付 = {データ取得時の更新日付} AND ....その他の条件


と言うSQLで更新していると言う事ですよね?この方法なら、データ取得時以降、データを更新するまでの間に、誰かにレコードを更新されているなら、必ず検出できます。もちろんルールを守らないソフトウェアがいたら、駄目ですけどね。

もしも取得(SELECT)して、比較(IF 〜)して、更新(UPDATE)していると言うことなら、それは楽観的なロックにすらなっていません。

引用:

これを排他制御だと思っていたのは私の認識違いだったのでしょうか。。。(^^;


いや、別に間違っていないと思いますよ。これもlockの一つですから。

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-05-24 16:24
こんにちは。
書いて更新してみたらみなさんが書き込みされている…はっ!これが楽観的ロック!

引用:

各項目を見て、その項目が更新されていなければ更新しない。
という意味で仰っているのでしょうか。。。?
そういう意味でしたら違います。
全テーブルの項目に更新日付という列を持っています。
DB更新の際には、必ず更新日付を見に行って、
更新日付が変更されていなければ、更新。
更新日付が変更されていれば、更新しない。
という意味だったのですが、
これを排他制御だと思っていたのは私の認識違いだったのでしょうか。。。(^^;


さかもとさんがおっしゃっているのは『項目を比較して』ということなので、更新日付を比
較することも含まれているかと思います。楽観的ロックの場合は比較的よく使われる手
法だと思います。

で、それが排他制御か否かといわれると、広義では排他制御と言えるかも知れないけ
れど、あまりそれを指して排他制御とは言わないので誤解される可能性もあるかも、と
思います。

# と思ったらさかもとさん本人からツッコミが入っていましたね。

楽観的ロックの説明はこの辺をご覧になっているのだと思いますが、むしろ大西彰さんの
このあたりの説明の方がわかりやすいかな、と思いました。

引用:

なんか微妙にVSで持ってるライブラリが信用できなかったりするわけなんですが。。


節子!それライブラリ違う!
とかいうツッコミはナシでしょうか・・・
なせ
常連さん
会議室デビュー日: 2006/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 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/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-05-24 16:56
引用:

甕星さんの書き込み (2006-05-24 16:23) より:
コード:
UPDATE テーブル名 SET フィールド名 = {値}, 更新日付 = {現在時刻}
WHERE 更新日付 = {データ取得時の更新日付} AND ....その他の条件


と言うSQLで更新していると言う事ですよね?この方法なら、データ取得時以降、データを更新するまでの間に、誰かにレコードを更新されているなら、必ず検出できます。もちろんルールを守らないソフトウェアがいたら、駄目ですけどね。

もしも取得(SELECT)して、比較(IF 〜)して、更新(UPDATE)していると言うことなら、それは楽観的なロックにすらなっていません。


えっ('▽';;;;
ちょっ・・・
マジっすか

思い切り取得(SELECT)して、
コード(C#等の)上で比較(IF 〜)して、
更新(UPDATE)
してました。。。

ちなみにそうした場合ってどうやって更新されたかそうでないかを取得するのでしょうか?

引用:

ぽぴ王子様の書き込みより:

節子!それライブラリ違う!
とかいうツッコミはナシでしょうか・・・


寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-05-24 17:04
引用:

なせさんの書き込み (2006-05-24 16:56) より:
寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw


たいてい人のせいにするやつこそ。
まず自分を疑うべきだ。
                  〜普通レベル以上のプログラマ全員からの言葉〜
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-05-24 17:07
> 思い切り取得(SELECT)して、
> コード(C#等の)上で比較(IF 〜)して、

このタイミングで他の人が更新する可能性がありますね。

> 更新(UPDATE)

> ちなみにそうした場合ってどうやって更新されたかそうでないかを取得するのでしょうか?

最初にデータを取り出したときにもともとの更新日付も一緒に
取り出しておいて、そのデータと現在のデータが同じかどうかを
where句で判断して同じであれば更新、ということですね。

#甕星さんの書いてる通りですが。

> 寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw

じゃ、.NETでの開発はしない、ということで(w

なせ
常連さん
会議室デビュー日: 2006/01/06
投稿数: 41
お住まい・勤務地: おおさか
投稿日時: 2006-05-24 17:18
引用:

どっとねっとふぁんさんの書き込み (2006-05-24 17:07) より:
> 思い切り取得(SELECT)して、
> コード(C#等の)上で比較(IF 〜)して、

このタイミングで他の人が更新する可能性がありますね。


そうですよね〜
そこでどういうロックの方法があるのかな〜?っと思ったわけです。

引用:

> ちなみにそうした場合ってどうやって更新されたかそうでないかを取得するのでしょうか?
#甕星さんの書いてる通りですが。


つまり、WHERE句に条件を書いてUPDATE文を走らせた後
SELECT句で更新を確認する。。ということでしょうか?
引用:

> 寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw

じゃ、.NETでの開発はしない、ということで(w


VSのIDEは好きなんですけどねぇ。。。
願わくば.NETで開発しない
その方向性でw

ちなみに
ぶさいくろうさん
デバッグモードで値を確認してみても、
a(0) | "1" string
b | "1" string
とかだったのですが。。
どうしろと?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-24 17:20
引用:

なせさんの書き込み (2006-05-24 16:26) より:

Dim a As string() = {"1","2","3","4"}
Dim b As string = "1"


String の比較のときは NULL でも入っていない限り
まず "=" でも問題ないと思いますけれどね

引用:

引用:


ぽぴ王子様の書き込みより:
引用:

節子!それライブラリ違う!
とかいうツッコミはナシでしょうか・・・



寧ろ、MSが信用できないっ!!と言い換えた方がいいのかなw


いや、Ifとかは制御文であってライブラリじゃないですから

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