2017-12-13 42 views
0

私のメソッドの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をスローした後でも、挿入エントリはロールバックされません。

+1

複数のものによって異なる場合があります。これはどのように呼びますか?豆の方法ですか?あなたは@Transactionalで注釈を付けられた別のメソッドからメソッドを呼び出しますか?あなたは例外を傍受しますか? – StanislavL

+1

プライベートメソッドをトランザクションにすることはできません。プロキシにすることはできません。 –

+0

@StanislavL私はこのメソッドを単純なメソッド呼び出しとして扱います。ふすまのメソッドも他のTransactionalメソッドもそうではありません。上記のコードで 'else runtimeException()'を実行してelse節の例外を代行します。 –

答えて

1

あなたの場合、@Transactionalは無視されます。代わりに、このメソッドを呼び出すメソッドのどこかでトランザクションが開かれました。

@Transactionalは、スプリングビーンズとpublicノンstaticメソッドで動作します。 Beanが作成されると、Springはトランザクションオープン/コミット/ロールバックロジックが評価されるプロキシを作成します。修正するには

  1. をクラスビーン
  2. を作るには、メソッド、メソッドのトランザクションを呼び出し非staticpublic
  3. 確認してください。それを無視するには、伝播を追加して、別々のトランザクションを開かせます(REQUIRES_NEW)。
+0

助けてくれてありがとう@StanislavL ..クラスBeanを作るために何が必要なのか教えていただけますか?私はBeanに変換する必要がありますどのクラスを..私は非常にフレームワークを春に新しいです..理解することはできません..あなたがビットを要求することを要求する。 –

+0

moveFilesAndUpdateDBメソッドを含むクラス。それは説明するには広すぎます。 Springがどのように動作するのか、そしてTransactionalがどのように春に働くのかを読む方が良いでしょう。 – StanislavL

+0

StanislavL ..私がしなければならないコードについての参考リンクは私にも役立ちます..もしあなたが共有してください。 –

関連する問題