2011-01-04 12 views
1

トランザクションが開始され、途中(コード内)新しいトランザクションを開始するために呼び出されます。内部トランザクションが完了すると、データはデータベースに保持されますが、データは外部トランザクションからは見えません。ネストされたトランザクションユースケースの外部トランザクションは、データベース(JPA、MySQL、Spring Framework、およびHibernate)に保持されている更新が表示されません。

はここ

@Transactional(readOnly = true) 
public void doSomething() { 
    // Some stuff happens here 
    doMoreStuff(); 
    // Some more stuff happens here. 
} 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void doMoreStuff() { 
    ... 
} 

「doMoreStuff」方法「はdoSomethingの」方法は、その更新されたデータを参照する必要があり、その後、データベース内のいくつかのデータを更新...コードスニペット(複数可)ですが、そうではありません。例えば、 "doMoreStuff"はbooleanをfalseからtrueに設定し、永続化します。 "doSomething"メソッドでは、値がfalseであるとしか見えません。

提案がありますか?

答えて

1

を私は(私は、MySQLができ、実際に巣トランザクションを信じないとして)取引「ネスティング」が休止状態で行われているのか分かりません。

したがって、2番目の(ネストされた)トランザクションはデータベースへの新規接続である必要があります。そうしないと、 "外部"トランザクションに影響を与えずに "ネスト"トランザクションをロールバックすることはできません。

これは確かにそうであるなら、あなたはおそらく、外側のトランザクションは、トランザクションの開始後をコミットされたすべてのデータを見てみましょうではないだろうREPEATABLE READでのMySQLのデフォルトの分離レベルでヒットしています。

この理論をテストするには、(外部トランザクションの)分離レベルをREAD COMMITTEDに変更して問題が解決するかどうか確認してください。

+0

しかし、私は現在、 "標準JPAはカスタム分離レベルをサポートしていません - JPA実装に特別なJpaDialectを使用しています"を得ています。 – codecraig

+0

...それは本当ですが、JPAはそれをサポートしていません。 https://jira.springframework.org/browse/SPR-5012。 mysqlでグローバルtxレベルを設定する必要がありました。 グローバルトランザクション分離レベルのコミットがコミットされました。 これは働いていたようです...ただ設定をスティックするように私のmysql設定ファイルを調整する必要があります:)感謝! – codecraig

1

ネストされたトランザクション - 使用してください - Propagation.PROPAGATION_NESTED

関連する問題