- PR -

コミット間隔

投稿者投稿内容
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-05-23 00:44
引用:

片桐 継さんの書き込み (2007-05-23 00:17) より:

catchでロールバック


 素朴な疑問なんですが、

 複数回コミットの場合は最後のブロックだけロールバックさせるんですか?
 一括コミットの場合は最後のレコードで例外が発生した場合は400万件分ロールバックですか?
 他にチェックがあり原則的に例外は発生しませんか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-23 07:55
チェック句やインデックスを一時的に無効にすると、かなり速くなる。

あとは、データをどう作っていて、弾かれたデータを特定することが容易なのか。そのへんも考えて仕様を決めないとね。
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-23 11:16
引用:

片桐 継さんの書き込み (2007-05-23 00:17) より:

catchでロールバック
finallyでコミット


ちょっと誤りがあるような...

-*-*-*-*-

私の最初の投稿についていろいろ代弁をして頂きました。
ありがとうございます。(*_ _)

私は "そんなことをする (トランザクションを分割する) 必要性があるのですか" という意図で書きました。
Rollback を考える必要があるのかどうかと、どのタイミング (時間対も含む) でどれくらいの頻度でこの更新処理が必要になるのかが良くわからないので、不適切という指摘もできかねます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
片桐 継
会議室デビュー日: 2007/05/16
投稿数: 14
お住まい・勤務地: 東京
投稿日時: 2007-05-23 21:07
引用:

ラフィンさんの書き込み (2007-05-23 00:44) より:
 複数回コミットの場合は最後のブロックだけロールバックさせるんですか?
 一括コミットの場合は最後のレコードで例外が発生した場合は400万件分ロールバックですか?
 他にチェックがあり原則的に例外は発生しませんか?



まず、前提として、私の書いた日本語処理フローを満たす要件があります。

・一回でコミットする場合であり、ロールバックは全件。
 これは1000件でも400万件でも変わらないです。
・データは原則正常終了することが前提となっている。
 データチェック等は完了済

これをはしょっちゃいましたね、すみません。

ですので、複数回コミットを行う場合には、整合性が取れる処理仕様があることが前提ですし、
一括コミットは何件のデータで来ようとも一発勝負、失敗したらロールバック、です。
こういうことが許されるのか否か、というところは
それこそ、開発の要件、システムの動作環境に依存する部分なので
どれが正しい、正しくないの答えなんて、
関わっている開発者以外に出せるものでは無い、と思います。

書き込みで私が言いたかったメインのことはこの事なので……

色々とご指摘いただいているFinallyとかcatchの部分ですけど、
このあたり、実際私も色々と勉強中なので怪しい部分は多々あるかと……
くわしい話になるとスレッド脱線なので
申し訳ないですが、私の勉強不足&出直してこいや、ってことで
一つ、腹の中に収めてやってくださいませんか?すみません。

_________________
片桐 継(Tugu Katagiri)@わんくま同盟
http://blogs.wankuma.com/esten
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-05-23 23:23
>片桐さん

 質問もはしょっちゃってるのに、謝られると恐縮です。
 スレの主題からはずれるんで適当に切り上げましょう。

 このスレの課題ではロールバックの条件に「不整合なデータが存在する場合」ってのがあるみたいです。それをふまえた上での質問でした。「そんなデータがあるかないかわからない内にコミットしたくないよね〜」というのは置いといて、

>「複数回コミットの場合は最後のブロックだけロールバックさせるんですか?」
 「途中までコミットしていいならエラー発生時もコミットしてもいいんじゃないの?」。

>「一括コミットの場合は最後のレコードで例外が発生した場合は400万件分ロールバックですか?」
 「そもそもロールバックだってコストがかかるよね?」

>「他にチェックがあり原則的に例外は発生しませんか?」
 「そもそもロールバックって最後の保険みたいなもんで、利用するものじゃないよね?」。

...とでも書けばよかったんですが、直接的でない(試すような)書き方になってしまい、申し訳ありませんでした。

 実際のところは、スレの課題はコンソールアプリですのでSQL*Loader使えばいいんじゃないかと思います。

 1.テキストファイルのうちにできるチェックを先ずしておく。
 2.Loader専用ワークテーブルに取り込む。(属性等はチェックできる)
 3.ターゲットのテーブルとワークテーブルで残りのチェックを全てやる。
 4.エラーがなければ一気にターゲットにInsert。(原則例外の発生なし)

..のような流れでいいんじゃないかな?




>色々とご指摘いただいているFinallyとかcatchの部分ですけど
 私が気にしていたのはロールバックのみなんですが、これは「Catchでロールバックした場合Finallyでコミットされるトランザクションはいつ開始されるの?」もしくは「コミットはFinallyでなく正常系の最後に書くよね?」あたりでしょうかね。

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