私のアプリケーションは、tamcatサーバーとmysql上のconiberian hibernateとspring frameworkです。Spring beans内のトランザクション
私はトランザクショナルとして機能に注釈を付けましたが、私はそれがtransacitonalメソッドとして動作していないことがわかりました(たとえば、関数の終了前にクエリブラウザでDBの変更を見ることができます)。
方法が豆から実行されますが、別のスレッドで、次のように:doDbStuff内部
executor.submit(new Runnable(){
@Override
public void run() {
someSpringService.doDbStuff();
}
});
、私はいくつかのメソッドを呼び出していて、それぞれの方法は、このように、テンプレートを使用して:
return getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
return session.createCriteria(MyClass.class).add(Restrictions.eq("id", id))
.uniqueResult();
}
});
時々、HiberateCallbackネイティブSQLクエリ内で実行され、セッションiをdoInHiberateの引数として使用します。
私の質問は - 1.私は別のスレッドを使用しているため、トランザクションの注釈は無視されますか? 2.トランザクションアノテーションでアノテーションされた関数をSpring Beanとして実行するにはどうすればよいですか(通常の関数としてではなく、おそらく1を解決します)? 3.トランザクションアノテーションを含むコールスタック内に複数のHibernateCallbackを作成すると、トランザクションメソッドとして動作しますか?私は同じセッションを使用する必要がありますし、内部の関数間で渡す?
おかげで...
私はTransactionSynchronizationManager.isActualTransactionActive()を確認しました。私が思ったように、falseを返しました。私は問題は、別のスレッド(トランザクションの注釈付き関数の呼び出しスタックには春のクラスが含まれていない...)から通常の関数としてSpring Beanを実行することです。通常のbeanとしてfuncitonを実行する方法を知っていますか? – yonatan
BTW - hibrtnateTemplate.beginSession()。startTransaction()を使用して関数の最後にコミットしても、内部関数はトランザクションを認識しません。 – yonatan
'someSpringService'をどうやって取得しますか? 'executor.submit()'の前に 'someSpringService.doDbStuff();'を実行してみてください(同じスレッド内)。それはその後動作しますか?もしそうなら、2番目の質問に値する。 –