- - PR -
削除処理をするときは?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-29 19:06
Webアプリケーションにて、画面で選択したレコードを削除する
処理を作ろうと思うのですが、 まず、画面で選択したレコードをselect文にfor updateをつけてロックしてから 削除するのが一般的でしょうか? 有無をいわず、deleteしてしまうのはあまり良くないという認識で良いでしょうか? (すいません、あまり更新系の作ったことがなくて) ちなみに、作成している処理は多人数による同時アクセスが考えられます。 よって、いきなりdeleteしてしまうと、選択したレコードが既に存在しない場合が 考えられます。 | ||||||||
|
投稿日時: 2005-08-29 21:07
DBMSによるのかもしれませんが、FOR UPDATEはムダでしょうね。 DB2やSQLServerなどのDBMSではdelete実行時にXロックをラッチするので、同様の効果があります。
そんときは更新件数が0件になるので普通に検出可能です。 | ||||||||
|
投稿日時: 2005-08-29 22:29
いきなり削除しても 問題はないとおもいますが、
| ||||||||
|
投稿日時: 2005-08-29 23:30
業務上の排他制御とDBMSのトランザクションは違います。
削除が問題になる云々の話は、業務でどのような排他制御を行いたいかで変わります。 問題の有無は「仕様」次第になると思います。 一般的に「楽観的ロック」と「悲観的ロック」という排他制御が存在します。 どの方法を採用すべきか調べてみるといいでしょう。 | ||||||||
|
投稿日時: 2005-08-30 05:22
WHERE句で指定してしまえばどちらでも同じような気がします。 それにOracle以外はだいたい削除時は悲観的ロックです。 [ メッセージ編集済み 編集者: Anthyhime 編集日時 2005-08-30 05:32 ] | ||||||||
|
投稿日時: 2005-08-30 10:01
どもです。がると申します。
個人的雑感でかつかなり根っこな部分に触れて恐縮なのですが。 私が知っている限りの世界観ですと「DELETE文を発行しない」です。 レコードに「削除フラグ」とかってのを必ず入れておいて、 そのフラグをtrueにすることで「削除したとみなす」って感じで 処理します(updateです)。 で、実際のレコードの削除は、定期的に ・削除フラグが立ってるレコードを抽出 ・バックアップ ・DELETE 発行 という風な手順を踏むです。 業務の場合、特にミッションがクリティカルであればあるほど 「間違えた場合」の想定が厳しいので。 私の場合、大抵上記のような方法をするです。 余談程度に読んでいただければ :-P | ||||||||
|
投稿日時: 2005-08-30 11:39
バッチでDELETE文を発行するときもFOR UPDATEを使うべきなのでしょうかね。[ メッセージ編集済み 編集者: Anthyhime 編集日時 2005-08-30 11:41 ] | ||||||||
|
投稿日時: 2005-08-30 12:45
みなさん、ありがとうございます。なかなか本人が話題についていけていない。
ちなみに環境はOracleです。 >問題の有無は「仕様」次第になると思います。 おっしゃるとおりですね。 作りたい仕様としては、画面にて選択したレコードの削除処理時に 既に誰か他の人が削除していたとしても、エラーとせず正常終了としたい。 というところです。 >一般的に「楽観的ロック」と「悲観的ロック」という排他制御が存在します。 >どの方法を採用すべきか調べてみるといいでしょう。 とりあえず↑を調べてみます。 |