2016-09-13 19 views
0

私はいくつかのデータベース呼び出しを行うアプリケーション内のメソッドの周りに宣言的なトランザクションを使用しようとしています。Spring - メソッドの周りにトランザクションが適用されていません

@Transactional 
public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    return retObj; 
} 

私はその後、私のXMLの設定で春の取引を設定します:

<tx:annotation-driven transaction-manager="transactionManager" order="200"/> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
     p:dataSource-ref="dataSource"/> 

私は、望んでいた私は、これに似たものになり、問題のメソッドに@Transactional注釈を適用していることでしたトランザクションはこの方法で失敗した場合に正常にロールバックすることを確認するために、そのメソッドをテストするので、私はこのような何かを見て私の方法で変更する:私はステートメ

public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    throw new RuntimeException(); //The RuntimeException should trigger a rollback 
} 

をこの2番目の方法では、私は予想したようにロールバックをしませんでしたが、作成したエントリをデータベースに残しました。私はまた、スタックのトレースでは、トランザクションのものを処理する挿入された私のメソッドの周りのスプリングのフックのいくつかの兆候を見ることを期待していましたが、私はこのトランザクションメソッドの直前に、 。

誰かが私が間違っていることを見ることができますが、トランザクション処理が適用されない場合のこの動作の原因になりますか?

+3

ショーを。 – chrylis

答えて

1

この動作は、DataSourceTransactionManagerを使用しているためです。このtxManagerはJDBCトランザクションに使用されます。たとえば、データベースに何かを挿入し、これが失敗すると、このトランザクションをロールバックします。許可よりも長い値を挿入しようとすると、txが失敗する可能性があります。データソースは失敗を認識していることに注意してください。

例では、例外をスローしているため、DataSourceは失敗を認識しません。これらの場合、JtaTransactionManagerを使用できますが、コンテナはJTAトランザクションをサポートしている必要があります。または、データベースで長すぎる値を挿入しようとすると失敗したり、NULL以外の列に異なる型または値の値を挿入したりすることができます。

あなたはここで多くを見ることができます:あなたは `myTransactionalMethod`を呼んでいる

http://www.journaldev.com/2603/spring-transaction-management-jdbc-example

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

関連する問題