2

JTA トランザクション処理の例として、オンラインで見つけた次のコード (ここ) を使用しています。

// Get a UserTransaction
        UserTransaction txn = new InitialContext().lookup("java:comp/UserTransaction");
try {
     System.out.println("Starting top-level transaction.");

     txn.begin();
     stmtx = conn.createStatement(); // will be a tx-statement 

     stmtx.executeUpdate("INSERT INTO test_table (a, b) VALUES (1,2)");
     stmtx.executeUpdate("INSERT INTO test_table2 (a, b) VALUES (3,4)");

     System.out.print("\nNow attempting to rollback changes.");

     txn.rollback();
}

一般的に、上記の例から引き出された JTA についていくつか質問があります。

  1. 私は言うことの要点を推測し、txn.beginロールバックは(明らかに)2つのSQLステートメントを正しくロールバックできることですか?
  2. それぞれの更新クエリは TRANSACTIONS そのものでしたよね? 一番下のロールバック呼び出しに到達できるように、それらは成功したに違いありません。彼らが成功した、つまりコミットした場合、一体どうすれば突然それらを元に戻すことができるのでしょうか?
  3. 最も重要な質問: と言うとどうなりtxn.begin()ますか? TransactionManagerJTA API から、このトランザクションをインスタンスごとに呼び出しスレッドに登録することになっていることがわかりました。TM はどのように にリンクされていUserTransactionますか? そして最後に、txn は、DB を 2 回変更し、DB と対話してロールバックできるという事実をどのように認識するのでしょうか? ANY を登録していないResourceManagerため、使用中のリソースを認識する必要はありません...

私はここで少し迷っているので、情報をいただければ幸いです... 質問 3 が最も気になります。

4

2 に答える 2

1

トランザクションについて学ぶことはたくさんありますが、私はあなたに有利なスタートを切ることができるかもしれません:

  1. はい。ただし、通常は問題が発生した場合にのみロールバックする必要があります。トランザクションの一部のステップが、技術的な問題 (構文エラー、テーブルが見つからない、セグメントのオーバーランなど) やアプリケーション ロジックの問題 (顧客たとえば、すべての注文品目に対して十分な資金がありません)。
  2. 自動コミット モードが無効になっている場合、挿入は実際にコミットする前にコミットされません。これらは、各トランザクション クライアントが参照できるデータベースの状態を決定する洗練された Multi-Version-Concurrency-Control (MVCC) を備えた Write-Ahead-Log (PostgreSQL、InnoDB-Engine、Oracle) を使用してデータベースに一時的に適用されます。非常に興味深いトピックです:-)。
  3. UserTransaction が現在のスレッドに登録されます。リソース (つまり、データベースまたはメッセージング サービス) は、UserTransaction に参加します。これは通常、分散トランザクション (XA トランザクション、2PC) を使用している場合にのみ必要です。

SQL プログラミング ( Head First SQLなど) をよく読んで、 Java EE 6 チュートリアルを確認することをお勧めします。

于 2013-06-05T11:58:13.697 に答える
1
  1. はい、またはイベントは 1 つだけです。これは、最後にトランザクションをコミットする機能でもあり、したがって、トランザクションがコミットされた後の新しい状態のみを他の同時トランザクションに表示させ、トランザクションの開始と終了の間のすべての一時的な状態 (つまり、I ACIDで)

  2. いいえ、更新は更新です。以前に開始したトランザクションの一部として実行されます。そのうちの 1 つが成功しない場合、例外が発生し、トランザクションをコミットする (つまり、以前の更新をすべてコミットする) か、トランザクションをロールバックする (つまり、以前の更新をすべてキャンセルする) かを選択できます。

  3. UserTransaction には、おそらくそのトランザクション マネージャーへの参照があります。Java EE 環境で DataSource から接続を取得すると、DataSource は Java EE コンテナーのトランザクション マネージャーにリンクされ、JTA トランザクションのロールバックでは、XA プロトコルを使用して、すべてのデータ ソースで実行されたすべての操作をロールバックします。トランザクション。それはコンテナの仕事であり、あなたの仕事ではありません。

于 2013-06-05T11:51:33.923 に答える