私のメソッドの1つで@Transactionalを使用しようとしています。シナリオ以下:など、私があるフォルダから別のフォルダに2つのファイルをコピーし、ファイルの詳細などfile_nameにでテーブルにレコードを挿入したかったのです、FILE_LOCATION、@Transactionalがdbトランザクションをロールバックしていません
:
シナリオアプローチ:ここでは、まずレコードを挿入してから実際にファイルを移動します。このメソッドには@Transactional
と注釈が付けられています。
予想:ファイルを移動する前に、両方のファイルがソースディレクトリに存在するかどうかを確認しています。ソースに存在しない場合は、RuntimeException()
を投げて、insert文をロールバックする必要があります。
実際:例外がスローされた後、挿入エントリはロールバックされません。
@Transactional
private static void moveFilesAndUpdateDB(srcFile1, srcFile2, destinationDir) throws RuntimeException
{
jdbcTemplate.update("insert into ......");
Boolean sourceFileExists = sourceFilePresentCheck(srcFile1, srcFile2);
if(sourceFileExists)
{
//code to dopy files
}
else
{
throw new RuntimeException();
}
}
RuntimeExceptionをスローした後でも、挿入エントリはロールバックされません。
複数のものによって異なる場合があります。これはどのように呼びますか?豆の方法ですか?あなたは@Transactionalで注釈を付けられた別のメソッドからメソッドを呼び出しますか?あなたは例外を傍受しますか? – StanislavL
プライベートメソッドをトランザクションにすることはできません。プロキシにすることはできません。 –
@StanislavL私はこのメソッドを単純なメソッド呼び出しとして扱います。ふすまのメソッドも他のTransactionalメソッドもそうではありません。上記のコードで 'else runtimeException()'を実行してelse節の例外を代行します。 –