Javaトランザクションには、JDBCトランザクション、JTA(JavaトランザクションAPI)トランザクション、コンテナトランザクションの3種類があります。スプリングトランザクションなどの一般的なコンテナトランザクション。コンテナトランザクションは、主にJ2EEアプリケーションサーバーによって提供されます。ほとんどのコンテナトランザクションは、JTAに基づいて完了します。これは、JNDIベースの非常に複雑なAPI実装です。したがって、この記事では、当面はコンテナトランザクションについては説明しません。この記事では、主にJ2EE開発における2つの比較的基本的なトランザクションを紹介します:JDBCトランザクションとJTAトランザクション。
JDBCトランザクション
JDBCのトランザクションを含むすべての動作は接続に基づいており、トランザクション管理はJDBCの接続オブジェクトを介して実行されます。 JDBCでは、一般的に使用されるトランザクション関連の方法は次のとおりです。
これが簡単なJDBCトランザクションコードです:
public void jdbctransfer(){java.sql.connection conn = null; try {conn = conn = drivermanager.getConnection( "jdbc:oracle:thin:@host:1521:sid"、 "username"、 "userpwd"); // falseに自動コミットを設定します。 stmt = conn.createstatement(); //アカウントAの金額を500 stmt.execute( "/ update t_account set boment = 500 where account_id = 'a'"); //アカウントBの金額を500 stmt.execute( "/ update t_account set bot = + 500 where account_id = 'b'"); //トランザクションconn.commit()を送信します。 //トランザクションコミット:転送の2段階操作が同時に成功します} catch(sqlexception sqle){//このトランザクションconn.rollback()で例外が発生します、ロールバック(); //トランザクションロールバック:転送の2段階操作は完全にveoke stmt.close(); conn.close(); } catch(例外無視){} sqle.printstacktrace(); }}上記のコードは、送信またはロールバックのいずれかのトランザクションを介した転送操作を制御する単純な転送関数を実装します。
JDBCトランザクションの長所と短所
JDBCは、Javaを使用したデータベーストランザクション操作に対して最も基本的なサポートを提供します。 JDBCトランザクションを通じて、複数のSQLステートメントを同じトランザクションに入れて、酸性の特性を確保することができます。 JDBCトランザクションの主な利点は、APIが比較的単純で、最も基本的なトランザクション操作を実装できることであり、パフォーマンスが比較的優れていることです。
ただし、JDBCトランザクションには1つの制限があります。JDBCトランザクションは複数のデータベースにまたがることができません。 ! !したがって、複数のデータベース操作または分散シナリオが関係する場合、JDBCトランザクションは無力です。
JTAトランザクション
なぜJTAが必要なのか
通常、JDBCトランザクションは、データの一貫性などの問題を解決できます。その使用法が比較的単純であることを考えると、多くの人は、Javaのトランザクションに関するJDBCトランザクションがあること、または一部の人々がフレームワークのトランザクション(冬眠、春など)について知っていることを知っているだけです。
JDBCトランザクションを職場で解決できないというシナリオに遭遇しない場合、あなたがしているプロジェクトはまだ小さすぎると言うことができます。例として、eコマースWebサイトを使用してください。通常、eコマースのウェブサイトを水平方向に製品モジュール、注文モジュール、ショッピングカートモジュール、メッセージモジュール、支払いモジュールなどに分割します。次に、異なるマシンに異なるモジュールを展開し、各モジュールはリモートサービスコール(RPC)およびその他の方法を介して通信します。分散システムを使用して外の世界にサービスを提供します。
支払いプロセスは複数のモジュールと対話する必要があり、各モジュールは別のマシンに展開され、各モジュールによって操作されるデータベースは一貫性がありません。現時点では、JDBCを使用してトランザクションを管理できません。コードを見てみましょう:
/ **支払い注文処理**/ @transactional(rollbackfor = exception.class)public void completeorder(){orderdao.update(); //注文サービスローカルに更新されたステータスaccountservice.update(); //ファンドアカウントサービスに電話して、ファンドアカウントPointService.update()にポイントを追加します。 //ポイントサービスを呼び出してポイントをポイントに追加するアカウントアカウントaccountingservice.insert(); //会計サービスに電話して、アカウンティングシステムのオリジナルアカウンティングバウチャーmerchantnotifyService.notify()を記述してください。 //販売者通知サービスに電話して、支払い結果通知を販売者に送信します}上記のコードは単純な支払いプロセス操作であり、5つのサービスが呼び出され、そのすべてがRPCを介して呼び出されます。 JDBCを使用してトランザクションの一貫性を確保する方法は? @Transactional Annotationをメソッドに追加しましたが、分散サービスを使用しているため、トランザクションは酸の効果を達成できません。
JTAトランザクションは、JDBCトランザクションよりも強力です。 JTAトランザクションには複数の参加者がいることがありますが、JDBCトランザクションは単一のデータベース接続に制限されます。次のJavaプラットフォームのいずれかのコンポーネントは、JTAトランザクション、JDBC接続、JDO PersipenceManagerオブジェクト、JMS Queue、JMSトピック、Enterprise Javabeans(EJB)、およびJ2EEコネクタアーキテクチャの仕様をコンパイルしたリソースアロケーターに参加できます。
JTAの定義
Java Transaction API(JTA)は、Application Program InterfaceのJavaエンタープライズバージョンです。 Java環境では、複数のXAリソースにまたがる分散トランザクションを完了できます。
JTAとその互換Javaトランザクションサービス(JTS; Java Transactionservice)は、J2EEプラットフォームに分散トランザクションサービスを提供します。ただし、JTAはインターフェイスのみを提供し、特定の実装を提供しません。代わりに、JTS仕様に従ってJ2EEサーバープロバイダーによって提供されます。いくつかの一般的なJTA実装があります:
1。J2EEコンテナが提供するJTA実装(JBOSS)
2。独立したJTA実装:JOTM、Atomikosなど。これらの実装は、J2EEアプリケーションサーバーを使用して分散トランザクション保証を提供しない環境で使用できます。 Tomcat、Jetty、普通のJavaアプリケーションなど。
JTAは、java.transaction.usertransactionを提供します。これは、次の方法を定義します。
ここでは、通常のJDBC操作をユーザートランザクションを使用せずにJTA操作に直接変換できることは注目に値します。 JTAには、DataSource、接続、リソースの要件があります。 XA仕様に準拠し、XA仕様の関連するインターフェイスを実装するクラスのみがJTAトランザクションに参加できます。 XA仕様については、私の記事の別の記事の関連する紹介をご覧ください。ここでは、現在の主流データベースがXA仕様をサポートしていることをお知らせください。
JTAトランザクションを使用するには、javax.sql.xadatasource、javax.sql.xaconnection、javax.sql.xaresourceインターフェイスを実装するJDBCドライバーが必要です。これらのインターフェイスを実装するドライバーは、JTAトランザクションに参加できます。 XadataSourceオブジェクトは、Xaconnectionオブジェクトの工場です。 Xaconnectionは、JTAトランザクションに参加するJDBC接続です。
JTAトランザクションを使用するには、XadataSourceを使用してデータベース接続を生成する必要があり、結果の接続はXA接続です。
XA接続(javax.sql.xaconnection)と非XA(java.sql.connection)接続の違いは、XAがJTAトランザクションに参加し、自動コミットをサポートしていないことです。
サンプルコード:
public void jtatransfer(){javax.transaction.usertransaction tx = null; java.sql.connection conn = null; try {tx =(javax.transaction.usertransaction)context.lookup( "java:comp/userTransaction"); // JTAトランザクションを取得するこの場合、JBossコンテナはjavax.sql.datasource ds =(javax.sql.datasource)context.lookup( "java:/xaoracleds")によって管理されます。 //データベース接続プールを取得すると、tx.begin()をサポートするXAをサポートするデータベースとドライバーが必要です。 conn = ds.getConnection(); // falseに自動コミットを設定します。 stmt = conn.createstatement(); //アカウントAの金額を500 stmt.execute( "/ update t_account set boment = 500 where account_id = 'a'"); //アカウントBの金額を500 stmt.execute( "/ update t_account set bot = + 500 where account_id = 'b'"); //アカウントBの金額を500 stmt.execute( "/ update t_account set bot = + 500 where account_id = 'b'"); //アカウントBの金額を500 stmt.execute( "/ update t_account set bot = + 500 where account_id = 'b'"); //トランザクションtx.commit()をコミットします。 //トランザクションコミット:転送の2段階操作が同時に成功します} catch(sqlexception sqle){try {//このトランザクションでは例外が発生します。 //トランザクションロールバック:転送の2段階操作は完全に取り消されましたstmt.close(); conn.close(); } catch(例外無視){} sqle.printstacktrace(); }}上記の例は、JTAトランザクションを使用した転送操作です。この操作はJ2EEコンテナに比較的依存しており、JNDIを介してユーザートランザクションと接続を取得する必要があります。
標準分散トランザクション
分散トランザクションには、トランザクションマネージャーと1人以上のリソースマネージャーが含まれます。リソースマネージャーは、あらゆるタイプの永続的なデータストアです。取引マネージャーは、すべてのトランザクション参加者間のコミュニケーションの責任を引き受けます。
上記の分散トランザクションの紹介を見てください。2PCのトランザクション管理に似ていますか?ただし、2PCは実際には、XA仕様に準拠して複数のリソースマネージャーを調整するトランザクションマネージャーの実装方法です。前に2PCと3PCにいくつかの記事がありました。これらの記事では、分散トランザクションのトランザクションマネージャーが複数のトランザクションの統一されたコミットまたはロールバックを調整する方法を紹介しました。また、グローバルトランザクション、DTPモデル、柔軟なトランザクションなどを含むがこれらに限定されない分散トランザクションに関連するコンテンツを詳細に紹介します。
JTAの長所と短所
JTAの利点は、分散トランザクションソリューションと厳密な酸を提供することです。ただし、標準のJTAトランザクション管理は、多くの欠点があるため、日常開発では一般的に使用されていません。
実装コンプレックス
通常、JTAユーザートランザクションはJNDIから取得する必要があります。これは、JTAを使用する場合、JTAとJNDIの両方を使用する必要があることを意味します。
JTA自体はかさばるAPIです。
通常、JTAはアプリケーションサーバー環境でのみ使用できます。そのため、JTAを使用すると、コードの再利用性が制限されます。
要約します
Javaトランザクションには、JDBCトランザクション、JTA(JavaトランザクションAPI)トランザクション、コンテナトランザクションの3種類があります。その中で、JDBCのトランザクション操作の使用は比較的簡単で、同じデータソースの操作を処理するのに適しています。 JTAトランザクションは比較的複雑であり、複数のデータベースでトランザクションを処理するために使用できます。これらは、分散トランザクションのソリューションです。
ここで簡単に話しましょう。 JTAトランザクションは、分散トランザクションのためにJavaが提供するAPIのセットですが、異なるJ2EEプラットフォームには異なる実装があり、使用するのにあまり便利ではありません。したがって、この責任あるAPIは一般にプロジェクトでは使用されません。業界で一般的に使用されている分散トランザクションソリューションには、非同期メッセージ保証、TCC、最大努力通知などが含まれています。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。