- PR -

削除処理をするときは?

投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2005-08-29 19:06
Webアプリケーションにて、画面で選択したレコードを削除する
処理を作ろうと思うのですが、

まず、画面で選択したレコードをselect文にfor updateをつけてロックしてから
削除するのが一般的でしょうか?

有無をいわず、deleteしてしまうのはあまり良くないという認識で良いでしょうか?
(すいません、あまり更新系の作ったことがなくて)

ちなみに、作成している処理は多人数による同時アクセスが考えられます。
よって、いきなりdeleteしてしまうと、選択したレコードが既に存在しない場合が
考えられます。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-08-29 21:07
引用:

まず、画面で選択したレコードをselect文にfor updateをつけてロックしてから
削除するのが一般的でしょうか?

まず、画面で選択したレコードをselect文にfor updateをつけてロックしてから
削除するのが一般的でしょうか?


DBMSによるのかもしれませんが、FOR UPDATEはムダでしょうね。
DB2やSQLServerなどのDBMSではdelete実行時にXロックをラッチするので、同様の効果があります。
引用:

ちなみに、作成している処理は多人数による同時アクセスが考えられます。
よって、いきなりdeleteしてしまうと、選択したレコードが既に存在しない場合が
考えられます。


そんときは更新件数が0件になるので普通に検出可能です。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2005-08-29 22:29
いきなり削除しても 問題はないとおもいますが、
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-29 23:30
業務上の排他制御とDBMSのトランザクションは違います。
削除が問題になる云々の話は、業務でどのような排他制御を行いたいかで変わります。
問題の有無は「仕様」次第になると思います。

一般的に「楽観的ロック」と「悲観的ロック」という排他制御が存在します。
どの方法を採用すべきか調べてみるといいでしょう。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-08-30 05:22
引用:

一般的に「楽観的ロック」と「悲観的ロック」という排他制御が存在します。
どの方法を採用すべきか調べてみるといいでしょう。


WHERE句で指定してしまえばどちらでも同じような気がします。
それにOracle以外はだいたい削除時は悲観的ロックです。

[ メッセージ編集済み 編集者: Anthyhime 編集日時 2005-08-30 05:32 ]
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-08-30 10:01
どもです。がると申します。
引用:

頭脳パンさんの書き込み (2005-08-29 19:06) より:
まず、画面で選択したレコードをselect文にfor updateをつけてロックしてから
削除するのが一般的でしょうか?

有無をいわず、deleteしてしまうのはあまり良くないという認識で良いでしょうか?
(すいません、あまり更新系の作ったことがなくて)


個人的雑感でかつかなり根っこな部分に触れて恐縮なのですが。
私が知っている限りの世界観ですと「DELETE文を発行しない」です。

レコードに「削除フラグ」とかってのを必ず入れておいて、
そのフラグをtrueにすることで「削除したとみなす」って感じで
処理します(updateです)。
で、実際のレコードの削除は、定期的に
・削除フラグが立ってるレコードを抽出
・バックアップ
・DELETE 発行
という風な手順を踏むです。

業務の場合、特にミッションがクリティカルであればあるほど
「間違えた場合」の想定が厳しいので。
私の場合、大抵上記のような方法をするです。

余談程度に読んでいただければ :-P
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-08-30 11:39
バッチでDELETE文を発行するときもFOR UPDATEを使うべきなのでしょうかね。

[ メッセージ編集済み 編集者: Anthyhime 編集日時 2005-08-30 11:41 ]
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2005-08-30 12:45
みなさん、ありがとうございます。なかなか本人が話題についていけていない。

ちなみに環境はOracleです。

>問題の有無は「仕様」次第になると思います。
おっしゃるとおりですね。
作りたい仕様としては、画面にて選択したレコードの削除処理時に
既に誰か他の人が削除していたとしても、エラーとせず正常終了としたい。
というところです。

>一般的に「楽観的ロック」と「悲観的ロック」という排他制御が存在します。
>どの方法を採用すべきか調べてみるといいでしょう。
とりあえず↑を調べてみます。

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