2013-08-14 6 views
14

私は@Transactionalアノテーションを持つクラスを持っています(そのメソッドのすべてにマーキングするのではなく)。クラス全体のトランザクションアノテーション+単一のメソッドを除く

私は@Transactionalと注釈を付けてはいけないそのクラスの中に単一のメソッドを持っていますが。

私の質問では、このメソッドに「非トランザクション」としてマークすることができますか?または、このメソッドを除いてこのクラスの各メソッドを「トランザクション型」としてマークする必要があります(多くの作業)

ありがとうございました。

+1

あなたは '@Transactional(propagation = NOT_SUPPORTED)'を試しましたか? –

答えて

21

使用するトランザクションの伝達方法はさまざまです。これらは列挙型Propagationにあります。あなたが使いたいかもしれないものは、

/** 
* Execute non-transactionally, suspend the current transaction if one exists. 
* Analogous to EJB transaction attribute of the same name. 
* <p>Note: Actual transaction suspension will not work on out-of-the-box 
* on all transaction managers. This in particular applies to JtaTransactionManager, 
* which requires the {@code javax.transaction.TransactionManager} to be 
* made available it to it (which is server-specific in standard J2EE). 
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager 
*/ 
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), 

/** 
* Execute non-transactionally, throw an exception if a transaction exists. 
* Analogous to EJB transaction attribute of the same name. 
*/ 
NEVER(TransactionDefinition.PROPAGATION_NEVER), // maybe not this one 

です。したがって、これらのいずれかでクラス内のメソッドにアノテーションを付けてください。

@Transactional 
public class MyTransactionalClass { 
    @Transactional(propagation = PROPAGATION_NOT_SUPPORTED) 
    public void nonTransactionalMethod() {...} 
} 

すべての伝播戦略hereを見つけることができます。

+0

これは、私が役に立たなかった "readOnly = true"の問題を解決する助けになりました –

+0

NOT_SUPPORTEDまたはNEVERオプションの提案は徹底的な答えではありません。開発者は、実行時に予期しない例外が発生する可能性があるため、開発者はこれを使用するのに非常に注意する必要があります。トランザクションサスペンションがサポートされていない場合、NOT_SUPPORTEDオプションは機能しません(javadocを参照)。メソッドがトランザクション内で誤って呼び出された場合は、例外をスローしません。開発者は、SUPPORTSオプションが呼び出されるとどこでもうまく動作するようにSUPPORTSオプションを検討する必要があります。決して厳密に意図されていない限り。 – coolersport

関連する問題