私は、コミットとロールバックの違いと、これらの操作が何をすべきかを知っています。 しかし、私はcommit()、rollback()を使うときや、何もしないときに同じ振る舞いをすることができる場合に何をすべきかはわかりません。Java:セマンティクスが変更されていない場合、vs rollbackと何も関係ない?
たとえば、dbに書き込まずにクエリを実行するコードがあるとします。 SQLiteデータベースと通信するアプリケーションで作業しています。
try {
if (deleteById(2))
// a) delete successful (1 row deleted)
else
// b) delete unsuccessful (0 row deleted, no errors)
} catch (SQLException e) {
// c) delete failed (because of an error (possibly due to constraint violation in DB))
}
がコミットまたは場合によってはロールバックやって、意味的な観点からそれを守っb)及びc)の結果:
try {
doSomeQuery()
// b) success
} catch (SQLException e) {
// a) failed (because of exception)
}
あるいはさらに興味深いは、単一の行を削除し、次のコードを、考えます同じ行動。
は一般的に、いくつかの選択肢は、各ケース内に行うことがある(A、B、C):
- は
- ロールバック
- をコミット何
しない任意のガイドラインはありますか特定の操作を選択するとパフォーマンスが向上しますか?正しい方法は何ですか?
注:自動コミットが無効であるとします。
データベースが開いているトランザクションがある場合、おそらくコミットするより速くなります。
この例では、私は、ベストプラクティス(miantainabilityワイズ)であると考えているかを示しています。ロールバックの場合、DBはトランザクションログをチェックし、変更を元に戻す必要があります。これが「変更なし」であっても、引き続きチェックが行われます。 – JNK
ロールバックは、同じトランザクションで実行された他の更新も元に戻します。あなたが持っているところは違いがありませんが(JNKの説明は例外ですが)、後で別のものを追加してそれを処理することを忘れると、噛む可能性があります。に入る良い習慣。 –
@ JNK、これはRDBMにわずかに依存しています - INSTEAD OFトリガーとの潜在的な競合もありますが、それはやや複雑です。 – Andrew