1. mybatisが単独で使用される場合、sqlsessionを使用してトランザクションを処理します。
パブリッククラスmybatistxtest {private static sqlsessionfactory sqlsessionfactory;プライベート静的リーダーリーダー。 @beforeclass public static void setupbeforeclass()スロー例外{try {reader = resources.getResourceasreader( "configuration.xml"); sqlSessionFactory = new SQLSessionFactoryBuilder()。build(reader); }最後に{if(reader!= null){reader.close(); }}} @test public void updutsusertxtest(){sqlsession session = sqlsessionfactory.opensession(false); //セッションを開くとトランザクションが開始されます{iusermapper mapper = session.getMapper(iusermapper.class); user user = new user(9、 "Test Transaction"); int riffectedcount = mapper.updateuser(user); //後続の例外ユーザー= newユーザー(10、「継続的にテストトランザクション」)のためにコミットステートメントは実行されませんでした。 int rifectedcount2 = mapper.updateuser(user2); // commitステートメントint i = 2/0は、その後の例外のために実行されません。 //ランタイム例外はtriggered session.commit(); //セッションを送信します。つまり、トランザクションコミット}最後に{session.close(); //セッションを閉じてリソースをリリース}}}
2。Springと統合した後、Springのトランザクション管理を使用します。
MyBatis-Springを使用する主な理由の1つは、MyBatisがSpringのトランザクション管理に参加できることです。 MyBatis-Springは、MyBatisの新しい特定のトランザクションマネージャーを作成するのではなく、春に存在するDataSourcetransactionManagerを利用しています。
DataSourcetransactionManagerが構成されたら、通常と同じように春にトランザクションを構成できます。 @transactionalアノテーションとAOPスタイルの構成がサポートされています。トランザクション処理中に、個別のSQLSessionオブジェクトが作成され、使用されます。トランザクションが完了すると、このセッションは適切な方法でコミットまたはロールバックされます。
トランザクションが作成されると、MyBatis-Springはトランザクションを透過的に管理します。 DAOまたはサービスクラスに追加のコードは必要ありません。
1。標準構成
Springのトランザクション処理を有効にするには、SpringのXML構成ファイルでDataSourcetransactionManagerオブジェクトを作成するだけです。
<bean id = "transactionManager"> <プロパティ名= "dataSource" ref = "dataSource"/> </bean>
指定されたDataSourceは、通常、Springを使用するJDBC DataSourceにすることができます。これには、接続プールとJNDIルックアップを通じて取得したデータソースが含まれます。
トランザクションマネージャーに指定されたデータソースは、SQLSessionFactoryBeanの作成に使用されたデータソースと同じデータソースでなければならないことに注意してください。そうしないと、トランザクションマネージャーは機能しません。
2。コンテナ管理トランザクション
JEEコンテナを使用しており、Springがコンテナ管理トランザクションに参加したい場合は、JtatransactionManagerまたはそのコンテナ指定サブクラスを使用してSpringを構成する必要があります。これを行う最も便利な方法は、Springのトランザクション名空間を使用することです。
<TX:JTA-Transaction-Manager/>
この構成では、MyBatisは、コンテナ管理トランザクションによって構成された他のSpringトランザクションリソースと同じです。 Springは、既存のコンテナトランザクションを自動的に使用し、SQLSessionを添付します。トランザクションが開始されない場合、またはトランザクションが必要な場合、Springは新しいコンテナがトランザクションを管理できるようにします。
Springのトランザクション管理ではなくコンテナを使用してトランザクションを管理する場合は、SQLSessionFactoryBeanに、他のSpringトランザクションマネージャーの代わりにBasic MyBatis ManageDtransactionFactoryを使用するように設定する必要があることに注意してください。
<bean id = "sqlsessionfactory"> <プロパティ名= "dataSource" ref = "dataSource"/> <プロパティ名= "transactionFactoryClass"> <balue> org.apache.ibatis.transaction.manage.managedtransactionfactory "/>> </property> </bean>
3。プログラミングトランザクション管理
MyBatisのSQLSessionは、プログラムのトランザクションを処理するための指定された方法を提供します。しかし、MyBatis-Springを使用する場合、Beanは春に管理されたSQLSessionまたはMapperを使用して注入されます。つまり、スプリングは通常トランザクションを処理することを意味します。春に管理されたsqlsessionでsqlsession.commit()、sqlsession.rollback()、またはsqlsession.close()メソッドを呼び出すことはできません。これを行うと、unsportedoperationExceptionがスローされます。注入されたマッパーを使用する場合、これらのメソッドにアクセスできないことに注意してください。接続が自動委員会に設定されているかどうかに関係なく、SQLSessionデータメソッドの実行またはSpringトランザクション以外のマッパーメソッドへの呼び出しは自動的にコミットされます。プログラミングトランザクションの例は次のとおりです。
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(transactionDefinition.Propagation_Required); transactionStatus status = txmanager.getTransaction(def); try {usermapper.insertuser(user); } catch(myexception ex){exを投げる; } txmanager.commit(status);4.@トランザクションメソッド:
ClassPathの下にBeans-Da-Tx.xmlファイルを作成し、Beans-Da.xml(シリーズV)に基づいてトランザクション構成を追加します。
<! - トランザクションマネージャー - > <bean id = "txmanager"> <プロパティ名= "dataSource" ref = "dataSource" /> < /bean> <! - トランザクション解釈ドライバー、クラス、およびメソッド@Transactionalはトランザクションになります - > <TX:Annotation-Driven Transaction-Manager = "Txmanager" /> <bean id "
サービスカテゴリ:
@service( "userservice")パブリッククラスユーザーサービス{@autowired iusermapper mapper; public int batchupdateuserswhenexception(){//非transactionalユーザー= new user(9、 "befutive exception"); int riffectedcount = mapper.updateuser(user); // execution success user user2 = new user(10、 "after exception"); int i = 1/0; //ランタイム例外をスローするintectedcount2 = mapper.updateuser(user2); //実行されていない場合(rifectedCount == 1 && fectoredcount2 == 1){return 1; } return 0; } @transactional public int txupdateuserswhenexception(){// transactional user user = new user(9、 "befutive exception"); int riffectedcount = mapper.updateuser(user); //その後の例外によるロールバックユーザーuser2 = newユーザー(10、例外 "); int i = 1/0; //ランタイムの例外をスローし、トランザクションロールバックint rifectedCount2 = mappper.updateuser(user2); //実行されていない場合(rifectedCount == 1 && fectoredcount2 == 1){return 1; } return 0; }}テストクラス:
@runwith(springjunit4classrunner.class)@contextconfiguration(locations = {"classpath:beans-da-tx.xml"})public class SpringIntegrateTxtest {@resource userservice userservice; @test public void updateusersexcectiontest(){userservice.batchupdateuserswhenexception(); } @test public void txupdateusersexcectiontest(){userservice.txupdateuserswhenexception(); }}
5。TransactionTemplateメソッド
Beans-da-tx.xmlを追加:
<bean id = "txtemplate"> <constructor-arg type = "org.springframework.transaction.platformtransactionmanager" ref = "transactionmanager" /> < /bean>
ユーザーサービスクラスに参加してください:
@autowired(必須= false)TransactionTemplate txtemplate; public int int txupdateuserswhenexceptionviatxtemplate(){int retval = txtemplate.execute(new TransactionCallback <integer>(){@Override public integer dointransaction(transactionStatus status){//トランザクションオペレーションユーザー= excembult = excembult = emblacount ";後続のユーザー2 =新しいユーザー(「例外」)。 Returnval; }SpringIntegratetXtestクラスに追加してください:
@test public void updateUserswhenexceptionviatxtemplatetest(){userservice.txupdateuserswhenexceptionviatxtemplate(); //}注:スローせずに例外やruntimeexceptionをキャッチすることはできません。
@transactional public int txupdateuserswhenexceptionandCatch(){//トランザクション操作ですが、周辺のフレームワークは例外をキャッチして、実行が正しい場合はそれを送信できません。 try {user user = new user(9、 "befuseed exception"); int riffectedcount = mapper.updateuser(user); //実行は成功しましたuser2 = new user(10、 "after exception"); int i = 1/0; //ランタイム例外をスローするintectedcount2 = mapper.updateuser(user2); //実行されていない場合(rifectedCount == 1 && fectoredcount2 == 1){return 1; }} catch(例外e){//すべての例外は、e.printstacktrace()を投げることなくキャッチされます。 } return 0; }