C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: [DBアプリ]楽観的ロック・衝突時の入力データについて


(過去ログ 67 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■39244 / inTopicNo.1)  [DBアプリ]楽観的ロック・衝突時の入力データについて
  
□投稿者/ たっぽ (4回)-(2009/08/03(Mon) 20:37:45)

分類:[.NET 全般] 

------------------------------------------------------------------
開発言語:
VB2005(ADO.NET関連の為、分類は「.NET全般」にさせて頂きました)

開発環境:
Windows XP(SP2適応)
Microsoft Visual Studio 2005(SP1適応)

データベース:
Oracle Database 10g Express Edition
(.NET 2.0 標準のOracleDataAdapterを使用して接続)

開発対象:
Windowsアプリ
------------------------------------------------------------------

楽観的ロックにて排他制御を行っている状態で、衝突時のユーザ入力データの対処について、どなたかご意見をお聞かせ頂きたい所存です。


Aさん・Bさんがそれぞれ違う端末で同じデータを取得し、データ更新入力を行ったとします。
Bさんの方が先に更新をかけ、その後Aさんが更新します。
当然、楽観的ロックを使用しているのでBさんの更新は問題無く終了し、Aさんはデータ取得時と現在のDBデータが異なる為、更新できません。

この時のAさんの入力データどうするか?
私が考えたのは
「破棄してしまい、現在のデータベースの情報を取得・確認してもらって再修正」
でした。
しかし、「破棄・再修正は二度手間になるのでしたくない」と言った意見が出てきて困っている次第です。


このような場合、
@運用で対応してもらう
A悲観的ロックでそもそも同時更新ができないようにしてしまう
等が良いのでしょうか?

@はあまり期待できないし、AはADO.NETを利用している為、非接続型なので楽観的ロックが望ましいのか?とも感じている為、迷っております。

よろしければ、ご意見をお聞かせ下さい。
引用返信 編集キー/
■39246 / inTopicNo.2)  Re[1]: [DBアプリ]楽観的ロック・衝突時の入力データについて
□投稿者/ もりお (22回)-(2009/08/03(Mon) 21:11:20)
No39244 (たっぽ さん) に返信
> しかし、「破棄・再修正は二度手間になるのでしたくない」と言った意見が出てきて困っている次第です。
> このような場合、
> @運用で対応してもらう
> A悲観的ロックでそもそも同時更新ができないようにしてしまう
> 等が良いのでしょうか?
>
> @はあまり期待できないし、AはADO.NETを利用している為、非接続型なので楽観的ロックが望ましいのか?とも感じている為、迷っております。
>
> よろしければ、ご意見をお聞かせ下さい。
3.ロックしない というのはだめですか。
悲観的ロックだと反映ボタンを押し忘れてロックしっぱなしに
なる危険性がありますですね。
アプリケーションの処理能力を考えると1が善いような気がします。
引用返信 編集キー/
■39247 / inTopicNo.3)  Re[1]: [DBアプリ]楽観的ロック・衝突時の入力データについて
□投稿者/ 魔界の仮面弁士 (1178回)-(2009/08/03(Mon) 21:38:26)
2009/08/03(Mon) 22:21:51 編集(投稿者)

No39244 (たっぽ さん) に返信
> Aさん・Bさんがそれぞれ違う端末で同じデータを取得し、データ更新入力を行ったとします。
> Bさんの方が先に更新をかけ、その後Aさんが更新します。
> 当然、楽観的ロックを使用しているのでBさんの更新は問題無く終了し、Aさんはデータ取得時と現在のDBデータが異なる為、更新できません。

『同時更新が発生した場合、そのアプリはどのように動いて欲しいのか』に関わることなので、
ケースバイケースだと思います。


たとえば、在庫をリアルタイムに処理するオンラインショップなどでは、
後から更新されるデータに対しては、『その商品は既に完売してしまいました。』と表示して、
先に登録された方を優先するべきかも知れません。


あるいは、単に『後書き優先』の実装で構わないケースもあるでしょう。
その場合にはたとえば、UpdateCommand に設定される SQL を
 UPDATE 従業員 Set 氏名 = @氏名, 住所 = @住所
 WHERE 従業員コード = @original_従業員コード
のようにする、という手法があります。

この場合、元のレコードが削除されていた場合は更新されませんが、
同時更新については、他のデータ(氏名や住所)が書き換えられたとしても、
主キー(従業員コード)が変更されていない限りは、そのまま更新されます。


> 私が考えたのは
> 「破棄してしまい、現在のデータベースの情報を取得・確認してもらって再修正」
> でした。
> しかし、「破棄・再修正は二度手間になるのでしたくない」と言った意見が出てきて困っている次第です。

競合した場合、本当に上書きして良いのかを再確認させるために、
最新の該当レコードを、確認用の別画面に ReadOnly 表示するというパターンもあります。
引用返信 編集キー/
■39249 / inTopicNo.4)  Re[2]: [DBアプリ]楽観的ロック・衝突時の入力データについて
□投稿者/ Jitta on the way (366回)-(2009/08/03(Mon) 23:19:00)
No39247 (魔界の仮面弁士 さん) に返信

> 『同時更新が発生した場合、そのアプリはどのように動いて欲しいのか』に関わることなので、

『同時更新が発生した場合、その業務はどのように動けばいいのか(動くべきなのか)』
に変更して、同意
引用返信 編集キー/
■39321 / inTopicNo.5)  Re[2]: [DBアプリ]楽観的ロック・衝突時の入力データについて
□投稿者/ たっぽ (5回)-(2009/08/05(Wed) 12:02:33)
もりお様・魔界の仮面弁士様・Jitta on the way様
ご意見ありがとうございます。
返事が遅くなって申し訳ありません…。

No39246 (もりお 様) に返信
> 3.ロックしない というのはだめですか。
> 悲観的ロックだと反映ボタンを押し忘れてロックしっぱなしに
> なる危険性がありますですね。
> アプリケーションの処理能力を考えると1が善いような気がします。

ロックしないのも、ありかもしれません。
単に「先書き優先」か「後書き優先」の違いですし。
…が、これも運用で対応は必要ですね。
この辺の部分を確認してみます。

全体を通しての運用台数が多く無い為、悲観的ロックにて
ロックしっぱなしが発生しても原因追求はできると思い、
悲観的ロックを案に上げています。
(説明不足で申し訳ない…)


No39247 (魔界の仮面弁士 様) に返信
> 『同時更新が発生した場合、そのアプリはどのように動いて欲しいのか』に関わることなので、
> ケースバイケースだと思います。

この辺りも、まだ不透明なので調査してみます。

> たとえば、在庫をリアルタイムに処理するオンラインショップなどでは、
> 後から更新されるデータに対しては、『その商品は既に完売してしまいました。』と表示して、
> 先に登録された方を優先するべきかも知れません。
>
> あるいは、単に『後書き優先』の実装で構わないケースもあるでしょう。
> その場合にはたとえば、UpdateCommand に設定される SQL を
>  UPDATE 従業員 Set 氏名 = @氏名, 住所 = @住所
>  WHERE 従業員コード = @original_従業員コード
> のようにする、という手法があります。
>
> この場合、元のレコードが削除されていた場合は更新されませんが、
> 同時更新については、他のデータ(氏名や住所)が書き換えられたとしても、
> 主キー(従業員コード)が変更されていない限りは、そのまま更新されます。

リアルタイム性やデータ整合性をどこまで求めているか?と言う点について
調査不足ですね…。確認してみます。

> 競合した場合、本当に上書きして良いのかを再確認させるために、
> 最新の該当レコードを、確認用の別画面に ReadOnly 表示するというパターンもあります。

このパターンは良いですね。
実装工数等、調査してみます。

No39249 (Jitta on the way 様) に返信
> ■No39247 (魔界の仮面弁士 さん) に返信
>
>>『同時更新が発生した場合、そのアプリはどのように動いて欲しいのか』に関わることなので、
>
> 『同時更新が発生した場合、その業務はどのように動けばいいのか(動くべきなのか)』
> に変更して、同意

ご指摘の点が、調査不足のようです。
再度、確認して推敲してみます。


私自身の調査不足が非常に大きい為、一度解決済みとさせて頂きます。
また、何かありましたら相談に乗って頂ければありがたいです。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -