0

オプティミスティック トランザクションを使用するシステムで、Java 疑似コードの次の 2 つのブロックを考えてみましょう。

例 A :

try {
    txn.begin();
    // database operations
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

例 B

txn.begin();
// database operations
try {
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

私たちのコードでは、トランザクションが双方向で実行されていることがわかります。私はAが正しいと確信しています。私の直感では、Bが間違っていることがわかりますが、Bは try ブロックにあり、エラーが発生した場合にキャッチしてロールバックできるため、Bに害はないようです。Bが正しいcommit()かどうか、またその理由を説明してください。ありがとう!

編集:だから、私が探している答えが本当に得られていません。Bがどういうわけか「悪い」ことは既に知っています。私が探しているのは、B が悪い理由です。つまり、 Bが失敗する場所でAが機能する可能性のある状況はありますか?

-tjw

4

2 に答える 2

1

少しミックスします (例 C):

txn.begin(); 
try {
    // database operations
    txn.commit();
}
catch (Exception e) {
    txn.rollback();
}

データベース コマンドは try ブロックに入れておきますが、'begin' トランザクションは除外します。「begin」でエラーが発生した場合、catch ブロックで開始されなかったトランザクションをロールバックしようとしません。

編集

例 B が悪い理由はトランザクションをロールバックする唯一の方法は、コミットが失敗した場合だからです。ただし、A も悪い理由は、トランザクションの開始時に失敗する可能性がわずかにあるためです。その場合、存在しないものをロールバックしようとします。

于 2011-03-22T03:15:21.580 に答える
0

Bでは、 commit の前にエラーが発生した場合、トランザクションをロールバックしません。少なくともそのコード部分ではコミットしませんが、後で偶然にコミットしませんか? できるだけ早くコミットまたはロールバックし、後で行われることを期待する何らかのクリーンアップのためにトランザクションを放置しない方がよいようです。

それはBの問題だと思います。

また、システムによっては、トランザクションを適切に廃止するために、finally ブロックも必要になる場合があります。

于 2011-03-22T03:09:12.583 に答える