2

DBで一連のクエリを実行した後、Spring Transaction(@TransactionalでマークされたSpringサービス)からストアドプロシージャを呼び出しています。

entityManager.createNativeQuery("call stored_procedure()");
query.executeUpdate();

Javaコードによって例外がスローされたときにストアドプロシージャのクエリをロールバックする(または、ストアドプロシージャで例外がスローされたために、Javaコードで行われたDBの変更がロールバックされる)ために、自動コミットを設定しましたmysqlサーバーの変数をfalseに設定します。これで問題の一部が修正されます。これで、DBトランザクションへのすべてのコードができました。私の問題は、ストアドプロシージャのクエリが、Javaコードで行われた(DBへの)変更を認識しないことです。つまり、ストアドプロシージャからのselectは、Springトランザクションが開始される前にDBにあった値を読み取ります。

私の質問は(タイトルに記載されているもの)ストアドプロシージャが(そのトランザクションから)呼び出される前に、SpringトランザクションでDBに加えられた変更を認識するようにストアドプロシージャのクエリを作成する方法です。

残念ながら、DBをダーティリードに設定することは今のところ私にとってオプションではありません。Springがmysqlで開くトランザクションのIDを取得し、そのトランザクション内でストアドプロシージャのクエリを実行することは可能でしょうか?

ありがとう

4

1 に答える 1

2

永続化コンテキストを基礎となるデータベースに同期させるために、Entity Manager で flush を呼び出す必要があることがわかりました。また、SP からトランザクション管理命令を削除したところ、期待どおりに機能しました。ストアド プロシージャ内のクエリは、Spring によって管理されるトランザクションの一部になりました。

于 2012-07-24T13:03:21.713 に答える