この記事は、主に、次のように、Springのトランザクションメカニズムの関連する内容を研究しています。
通常、グローバルトランザクションとローカルトランザクションの2つの取引戦略があります。グローバルトランザクションは、複数のトランザクションリソース(つまり、データソース、通常はデータベースとメッセージキュー)にまたがる可能性があり、通常、サーバーのJTAサポートが必要なJ2EEアプリケーションサーバーの管理が必要です。ローカルトランザクションは、基礎となる層によって採用されている永続性技術に関連しています。基礎となるレイヤーがJDBCを直接使用する場合、接続オブジェクトを使用してトランザクションを操作する必要があります。 Hibernate Persistenceテクノロジーを使用する場合は、セッションオブジェクトを使用してトランザクションを操作する必要があります。
一般に、JTAトランザクション、JDBCトランザクション、冬眠トランザクションを使用したプログラミングプロセスは、ほぼ次のとおりです。
上記の図からわかるように、従来のトランザクションプログラミングを使用して、プログラムコードを特定のトランザクションポリシーのAPIと結合する必要があります。アプリケーションが戦略を切り替える必要がある場合、コードを大幅に変更する必要があることを意味します。ただし、春のトランザクションを使用する場合、問題はありません。
Sringはトランザクションサポートを提供せず、基礎となるトランザクションのラッピングのみを担当し、スプリングレベルでは、外の世界に統一されたプログラミングAPIを提供します。 Spring Transactionのコアは、PlatformTransactionManagerインターフェイスです。
PlatformTransactionManagerは、特定のタイプに依存しないトランザクションインターフェイスを表し、JDBCトランザクション、冬眠トランザクション、さらにはJTAトランザクションなどのトランザクションを表すことができます。
Springaトランザクションメカニズムは、典型的なポリシーモデルです。 PlatformTransactionManagerは、トランザクション管理インターフェイスを表しますが、トランザクションの管理方法がわかりません。トランザクション管理は、3つの方法を提供するためにのみ必要です。TransactionGetTransaction getTransaction(), commit()トランザクション、 rollback()ただし、特定の実装は、実装クラスに任されています。プログラマーは、使用される特定のトランザクションタイプに従って、構成ファイルでトランザクションタイプを構成するだけです。基礎となる春は、特定のトランザクション実装クラスを自動的に使用して、トランザクション操作を実行します。プログラマーの場合、彼らは基礎となるプロセスをまったく気にする必要はありません。彼らはPlatformTransactionManagerインターフェイスのためにプログラムするだけです。 PlatformTransactionManagerインターフェイスは、次の方法を提供しますgetTransaction(..), commit(); rollback();これらはすべて、プラットフォームとは無関係のトランザクション操作です。
getTransaction()の完全な執筆はTransactionStatus getTransaction(TransactionDefinition definiton)です
このメソッドは、トランザクションオブジェクトを返すために使用され、パラメータートランザクションデファイニッションはトランザクションオブジェクトのさまざまな属性を指定できます。通常、トランザクション、伝播属性、タイムアウトの分離属性を指定し、これらの属性のみを読み取ることができます。
Springの特定のトランザクション管理には、PlatformTransactionManagerを構成ファイルで構成する必要があります。以下は、さまざまなタイプのトランザクションに対応するスプリング構成です。
JDBCデータソースのローカルトランザクションマネージャーの構成は次のとおりです。
<! - データソースBeanを定義し、C3P0データソースを使用してそれを実装し、データソースの必要な情報を注入します - > <bean id = "DataSource" Destroy-Method = "close" p:driverclass = "com.mysql.jdbc.driver" p:jdbcurl = "jdbc:" "pisd" "p:" "p:" pisder = "" jdbc: "jdbc:" jdbc: "" pisd "" pidder P:maxpoolsize = "40" p:minpoolsize = "2" p:initialpoolsize = "2" p:maxidletime = "30" /> <! - JDBCデータソースのローカルデータマネージャーを構成します。
コンテナ管理用のJTAグローバルトランザクションマネージャーの構成は次のとおりです。
<bean id = "dataSource" p:jndiname = "jdbc /jpetstore" /> <! - jtatransactionmanagerクラスを使用して、このクラスはプラットフォームトランザクションマネージャーインターフェイス - > <! - jtaグローバルトランザクションを使用して、springコンテナはjava ee serverからの取引リソースを取得することができます。
JTA Global Transactionsの場合、トランザクションマネージャーの実装クラスJTATRANSACTIONMANAGERを指定する必要があります。スプリングコンテナは、トランザクションマネージャーへの明示的な注入なしに、J2EEサーバーからデータソースを取得します。
Hibernate Persipence Technologyに基づくSpringローカルトランザクション構成は次のとおりです。
<! - データソースBeanを定義し、C3P0データソースを使用してそれを実装し、データソースの必要な情報を注入します - > <bean id = "DataSource" Destroy-Method = "close" p:driverclass = "com.mysql.jdbc.driver" p:jdbcurl = "jdbc:" "pisd" "p:" "p:" pisder = "" jdbc: "jdbc:" jdbc: "" pisd "" pidder P:maxpoolsize = "40" p:minpoolsize = "2" p:initialpoolsize = "2" p:maxidletime = "30" /> <! - 冬眠のセッション構造を定義します。すべての永続的なクラスをリストするために使用 - > <プロパティ名= "AnnotatedClasses"> <list> <! - 以下はすべてのPOクラスをリストするために使用されます - > <value> com.entity.user </value> </list> </property> <! - 冬眠のセッション構成プロパティ - > <プロパティ= <hibernateproperties "> <props> key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialect </prop> <! - hibernateマッピングテーブルに基づいてデータテーブルを作成するかどうか - > <prop key = "hibernate.hbm2ddl.auto"> props> </propert </properts </propertian <マネージャー、hibernatetransactionmanagerクラス - > <! - このクラスは、hibernateのプラットフォームトランザクションマネージャーインターフェイスの特定の実装です - > <! - hibernatetransactionmanagerの構成 - > <bean id = "transactionmanager" p:sessionactory-ref = "sessionfactory" />>>>>>>>
Spring TransactionsがHibernateポリシーを採用する場合、通常、データソース、SessionFactory、およびTransaction Managerの構成に3つのポイントが必要です。
基礎となる層が冬眠粘包式レイヤーテクノロジーを使用し、トランザクションがJTAグローバルトランザクションを使用している場合、構成は次のとおりです。
<! - JTAデータソースを構成 - > <bean id = "dataSource" p:jndiname = "jdbc /jpetstore" /> <! - hibernate sessionfactoryを定義します。 SessionFactoryはデータソースに依存してDataSourceを注入する必要があります。 <! - hibernateのセッションファクトリープロパティを定義します - > <プロパティ名= "hibernateproperties"> <props> <! - hibernateの接続方言を指定します - > <prop key = "hibernate.dialect"> org.hibernate.dialect.dialect.mysql5innodbdbdbdialect </prop> prop> <! <prop key = "hibernate.hbm2ddl.auto"> update </prop> </props> </property> </bean> <! - jtatransactionmanagerクラスを使用します。
以前のHibernateベースのSpring Transactionと比較して、これはデータソースをJNDIデータソースに置き換え、トランザクションマネージャーをjtatransactionManagerに置き換えることです。
JTAグローバルトランザクションの場合、基礎となるアプリケーションサーバーのサポートが必要であるため、さまざまなアプリケーションサーバーが提供するJTAグローバルトランザクションの詳細に違いがある場合があります。したがって、実際にグローバルトランザクションマネージャーを構成する場合、OracleのJavaee Application Serverによって提供されるOC4JJTATRANSACTION MANAGER、WeBlogicJTATRANSACTIONMANAGERが提供するWebLogicJTATRANSACTIONMANAGERなど、JTATRANSACTIONMANAGERのサブクラスを使用する必要がある場合があります。
上記のさまざまなトランザクションタイプのSpring構成から、アプリケーションがSpringトランザクション管理を採用する場合、アプリケーションを特定のトランザクションAPIと組み合わせる必要がないことがわかります。アプリケーションは、PlatormTransactionManagerインターフェイスにプログラムする必要があります。 ApplicationContextは、構成ファイルに基づいて、適切なトランザクションポリシー実装クラス(PlatormTransactionManagerの実装クラス)を選択します。
したがって、春にトランザクション制御プログラミングを実行する方法を詳細に、通常2つの方法があります。
プログラミングトランザクション管理:PlatormTransactionManagerが提供する3つの抽象的なメソッドを直接使用して、コード内のトランザクションフローを制御することです。また、スプリングコンテナでタイプのプラトルムトランザクションマネージャーの豆を入手することもできます。このBeanは、常にPlatormtransactionManagerの特定の実装クラスのインスタンスです。特定の実装クラスは、ポリシーパターンに従ってApplicationContextによって選択されます。プログラマーはそれを気にする必要はありません。インターフェイス指向のプログラムのみが必要です。
宣言的トランザクション管理:この方法では、トランザクション制御プロセスをコードに書き込む必要はありませんが、AOPを使用して、構成ファイルを介してトランザクションの組み込みを完全に完了します。つまり、XML構成ファイルはビジネスコンポーネント用のトランザクションエージェントを構成でき、トランザクションエージェントはビジネスコンポーネントのトランザクションコントロールを提供します。現在、この方法は最低であり、ソースコードの侵入が最も低くなっています。
宣言的トランザクションを使用する場合、構成ファイルを書き込み、トランザクション制御が必要なコンポーネントの種類を構成するだけです。ビジネスコンポーネントはAOPメカニズムの下でトランザクション制御に織り込まれ、プログラマーはトランザクション管理コードを作成する必要がなく、ビジネスコンポーネントの開発に焦点を当てることができます。したがって、宣言的なトランザクション管理が一般的に推奨されます。
SpringのXMLスキーマ法は、簡潔なトランザクション構成戦略を提供します。名前空間<tx:advice>を介してトランザクション強化処理を構成します。ここでは、トランザクションのさまざまな属性を指定できます(分離属性、伝播属性、タイムアウト、読み取り専用属性など)、およびトランザクション拡張は、AOPのエントリポイントにAOPのエントリポイントに導かれる可能性があります。取引操作。 C3P0データソース、SpringのJDBCトランザクションマネージャー、およびトランザクションのプロパティの設定を使用して、データ操作用のNewsDaoImpl Beanを構成する簡単な例を次に示します。
完全なスプリング構成は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframework.org/schema/beans" xmlns:p = "http://www.springframework.org/schema/p" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework. xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.orgwork/schema/ http://www.springframework.org/schema/aop http://www.springframework.org/schema/spring-tx-4.0.xsd http://www.springframework.org/データソースBeanを定義し、C3P0データソースを使用してそれを実装し、データソースの必要な情報を注入します - > <bean id = "dataSource" Destroy-method = "close" p:driverclass = "com.mysql.jdbc. P:user = "root" p:password = "" p:maxpoolsize = "40" p:minpoolsize = "2" p:initialpoolsize = "2" p:maxidletime = "30" /> <! - JDBCデータソースのローカルデータマネージャー、Dataourcetransactionmanager Class-> <bean id = <bean id = <bean id = P:DataSource-Ref = "DataSource" /> <! - ビジネスロジックBeanを構成 - > <bean id = "newsdao" p:ds-ref = "datasource" /> <! - トランザクションマネージャーの指定 - > <tx: "txadvice" transaction-manager = <!-dation-manager = <! - > <tx:属性> <! - getから始まるすべてのメソッドは読み取り専用です - > <tx:method name = "get*" read-only = "true" /> <! - 他のすべてのメソッドはデフォルトでトランザクションの対象となります - > <tx:method name = "*" quation = "defiction =" 5 " <aop:config> <! - エントリポイントを構成するすべてのインプルエンドクラスのすべてのメソッドの実行をimplパッケージに照合します - > <aop:aop:aop:aop expression = "execution(*com.dao.impl。*empl。*(..)" id = "mypointcut" /> < pointcut-ref = "mypointcut"/> <! - emplパッケージの下でABCから始まるクラスのすべてのメソッドの実行に一致するように別のエントリポイントを構成 - > </aop:config> </beans>
NewsDaoIMPLコードでは、複製データをテーブルに挿入することです。
パッケージcom.dao.impl; Import javax.sql.datasource; import org.springframework.jdbc.core.jdbctemplate; Import com.dao.newsdao; public class newsdaoimplはNewsdao {private datasource ds(datasource ds); ds;}@override public void insert(string title、string content){// c3p0データプールの使用jdbctemplate jt = new jdbctemplate(ds); jt.update( "Insert into News_inf" + "値(100、?、、?)、タイトル、コンテンツ);コンテンツ); //トランザクションコントロールがない場合、最初のレコードを挿入できます//トランザクションコントロールが追加された場合、最初のレコードは挿入されません}}}これがテスト方法です。
public static void test3(){applicationContext ctx = new classpathxmlapplicationContext( "beans4jdbc.xml"); //取引エージェントBean Newsdao dao =(Newsdao)ctx.getBean( "Newsdao"、Newsdao.class); dao.insert(「Javaプログラミングのコアアイデア」、「軽量Java EE開発」); System.out.println( "実行完了"); }テスト方法を実行すると、例外がスローされていることがわかります(データが重複しているため)。トランザクション制御のために、データベースにデータ挿入はありません。
上記の例で見ることができるように、通常はXMLスキーマ構成では、実際には通常のBeanに対してAOP構成が行われ、アドバイスの強化が組み込まれています。アドバイスの強化は、データソースに依存するトランザクションマネージャーで構成されています。
<aop:advisor>の場合、アドバイスとエントリポイントの拘束力は、春の底部(Beannameautoproxycreator、defaultadvisorautoproxycreatorなど)のBean Postprocessorによって行われます。これは本質的に動的なプロキシです。
さらに、<tx:advise> configuration拡張では、特定の例外が発生した場合、ロールバックではなくフォースロールバック、つまりlollback-for = "xxxexception"、no-rollback-for = "xxxexception"を指定することもできます。
XMLスキーマメソッドを使用することに加えて、このメソッドにトランザクションプロパティを持つように @Transactionアノテーションをメソッドに直接追加することもできます。 @Transactionでは、トランザクション(分離プロパティ、伝播プロパティ、タイムアウト、読み取り専用プロパティなど)にさまざまなプロパティを構成できます。さらに、a <tx:annotation-triven構成をXML構成に追加する必要があります。これにより、スプリングがアノテーションに応じてトランザクションエージェントを構成し、トランザクションのプロパティ構成とAOPカット構成を1つのステップでのみ完了できます(メソッド名のアノテーション構成を介して直接)。
<TX:Annotation-driven Transaction-Manager = "TransactionManager" />
Newsdaoimpl。
@transactional(propagation = propagation.required、隔離=分離=分離、default = 5)@overridepublic void insert(string title、string content){上記は、Springのトランザクションメカニズムの例コードに関するこの記事の内容全体であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!