- - PR -
DBへのUPDATEまたはINSERT処理に関して
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-29 19:07
catch句中に処理を実装しないのなら、基本的にcatch句を書くべきではありません。そのままthrowする方がいいです。catchを書くのはコンパイルを通すためではありません。 ……と、いきなり話が逸れました。申し訳ありません。 selectでチェックしてからinsert/updateだと、並行で同様の処理が行われた場合に一意制約エラーを発生する可能性がありますので、それだけを頭の片隅にでも留めておけばおっけーだと思います。 | ||||||||||||
|
投稿日時: 2005-03-29 19:43
私も1ですが、サンプルでupdateしてからinsertするのも見た事があります。
| ||||||||||||
|
投稿日時: 2005-03-30 10:33
すいません、言葉足らずでした。 catch句中に処理を実装しないというのは、、
ということではなく、
のように、あらかじめ想定される正常シーケンス(この場合はupdate処理)をcatch句中で処理するという意味でした。 catch句中にはほんとはあってはならない例外を処理するというポリシーの方がいいのかと考えて今回の質問をさせて頂きました。(みなさんがどのようにされているかお聞きしたかったもので) 並行処理の場合はたしかに一意性制約に引っかかる可能性があります。気が付きませんでした。気をつけたいと思います。 ON DELETE CASCADEに関してですが、 実績データが商品が無くても意味のあるものであれば、外部参照を設定しない、 商品が無くなったら実績データも存在する必要がないということなら、外部参照を設定しても良いのではないでしょうか? ON DELETE CASCADEはデータベースに依存してしまいますので、移植性は低くなるかもしれません。 一般的にはみなさんどうされているんでしょうか。 | ||||||||||||
|
投稿日時: 2005-03-30 11:47
要は、そのような厳密な設計が必要になってくるということではないでしょうかね。 下手に軽く考慮しただけで設定して、バグもないからよし運用だなんてやってみて 「うわ、こんなルートもあったのかあああ」なんてバグっちゃった時にデータが消え てるともう終わりですからね。 きちんと考慮されていればいいとは思いますけど。そういう意味で玄人向けなんじゃ ないですかね。私は使ったことないんですけど。 | ||||||||||||
|
投稿日時: 2005-03-30 12:09
ふと思った。商品テーブルと実績テーブルに連鎖削除を設定するのは怖いけど、伝票(ヘッダ)テーブルと伝票明細テーブルに連鎖削除を設定するのは使い勝手がいいかもしれない。伝票(ヘッダ)を削除することで、明細を木っ端微塵にできるので。今度、使ってみようかな。 |