2016-12-06 11 views
1

のは、考えてみましょう:春のトランザクションアノテーション - どのように機能しますか?

delete() 
    update() 
    insert() 
    @Transactional 
    void doDBstuff(){ 
     delete() 
     update() 
     insert 
    } 

をあなただけdoDBstuffを見ることができるように。他のメソッド(delete, update, insert)を呼び出します。それらのすべてはmybatisを使用してデータベースを処理します。

@Transactional注釈が有効である必要がある場合は教えてください。私はそれを手動でテストしましたが、それはうまくいくと思われますが、私はそれがどのように機能するかを確実に理解したいと思っています。

私は答えを求めます:
1.トランザクションセーフですか?
2.アンダーフッドはどのように機能しますか?私はそれが複雑であることを知っています。私は、いくつかの幻想だけを、題材についてはぼんやりと見ることを意味する。

+2

あなたのフレームワーク(おそらくSpring)は '@ Transactional'でアノテーションされたメソッドを持つすべてのBeanを探します(おそらく' 'またはそれを使用してSpringの設定で、 。ボイラープレートコードをこれらのメソッド(AOPを使用)に貼り付けると、トランザクションが開始され、トランザクションが完了するとコミットされます。メソッドが例外をスローすると、ロールバックが実行されることがあります。 – BretC

+0

ロールバックが行われる可能性がありますか?私はロールバックをしなければならないと思った。それで、それはトランザクションになると大丈夫ですか?呼び出されたメソッドに注釈が付きませんか?私はそれを設定しません。私は春の靴を持っています。 –

+0

私はあなたが 'rollbackFor'アノテーション値として入れたものに依存すると思っていましたが、私は間違っているかもしれません... – BretC

答えて

3

@Transactionalは、Springの他のほとんどの魔法のように動作します。プロキシー(または、AspectJを使用している場合はそうではありません)。 @Transactionalアノテーションを持つBeanを挿入すると、Spring Frameworkは@Transactionalメソッドへの呼び出しが注釈によって要求されたとおりにトランザクションにラップされるように、プロキシを自動的にワイヤリングします(例外がスローされるとロールバックされます)。

あなたのコードがトランザクション内で実際に実行されるかどうかは、依存します。 AspectJを使用している場合、それは予期したとおりにストーリーの終わりでトランザクション内で実行されます。 AspectJを使用しておらず、Springがプロキシを作成しなければならない場合、クラスのautowired Bean上でどこでも呼び出されますが、手作業で構築したインスタンスやクラス自体からインスタンスを呼び出そうとすると、自動的にトランザクション内で実行されません。

+0

pom.xmlにAspectJを追加すれば十分ですか? –

+1

'@Transaction'機能を有効にするには、スプリング設定に' @ EnableTransactionManagement'またはを使用します。参照のため公式のドキュメントhttp://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-decl-explained –

+0

'@ EnableTransactionManagement'どこで? –

関連する問題