- PR -

削除処理をするときは?

投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2005-08-30 14:29
ちょっと勉強してみました。

>作りたい仕様としては、画面にて選択したレコードの削除処理時に
>既に誰か他の人が削除していたとしても、エラーとせず正常終了としたい。
>というところです。
これは楽観ロックということになるんですね。
それで、画面で表示したレコードをロックしちゃうのが悲観的ロックですね。

やりたいのは楽観ロックが近いです。

さらに、楽観的同時実行制御をやるかどうかという問題ですが
ちょっと悩んでます。

削除しようとしたら既に削除されていた場合に
「既に削除されています」とエラーにするか、
問題ないとみなして、正常終了としてしまうかです。

これも仕様によりけりだと思うのですが、ちょっと再考してみます。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-08-30 19:11
現在カスタムERPプロダクトの開発に携わっていますが、そのプロダクトでもがるがるさんが書かれたのと同じく、削除がかならずしも DELETE ではないというデザインです。

あまり明るくないので突っ込まれると勉強し直しますが(^.^; 、金融・財務系では特に削除されたデータを DB リカバリではない方法で素早く復元できるように、削除フラグによる論理削除で処理するケースが多いようです。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2005-08-30 20:19
論理削除も検討することにしました。

ところで、最初の質問に戻るのですがバッチ等から
delete文を発行するときは、事前にfor updateが必要でしょうか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-08-31 08:23
バッチの仕組みからすると、

1.削除フラグが立ったレコードの結果セットを取得。
2.結果セットをファイルに書き出す。
3.結果セットのレコードを削除。

という流れが自然だと思いますので、where current of で削除するためにもfor updateが必要になるのではないかなと思います。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-09-01 10:11
どもです。がるです。

んっと。「可能な限りの全てをSQLで片付ける」前提
であればfor updateは必須だと思われます。
逆に「プログラムメインで片付ける」場合、特にfor update
は使わなくてもいけるです。

この辺は設計思想の方向性によると思うです。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2005-09-01 16:34
結論としては、
観的同時実行制御で、論理削除して、

実際の削除は、バッチからFOR UPDATEをかけてから
削除するようにしました。

たくさんのご意見ありがとうございました。

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