1

私はSpringとトランザクションにかなり慣れていません。この質問は以前にもあったと思いますが、まだ正しい方法がわかりません。

私はSpringとHibernateを使用しています。次のようなサービスメソッドがあります。

@Transactional
public void processPendingReport(Report report) {
  try {
    // Do processing stuff, update report object state
    reportDAO.save(report);
  } catch (Exception e) {
    reportDAO.markReportAsFailed(report);
  }
}

処理中に RuntimeException が発生した場合、「rollbackOnly としてマークされたトランザクション」RollbackException がスローされ、その結果、レポートは失敗としてマークされません (私はそうしたいのですが)。

@Transactional(noRollbackFor=Exception.class) を使用してみましたが、それでも同じ問題が発生します.何か提案はありますか? 構成の問題でしょうか?

4

1 に答える 1

-1

データベース例外 (制約違反など) が発生した場合、reportDAO.save()またはreportDAO.markReportAsFailed()アプリケーション レベルで何を行っていても、データベース レベルでトランザクションがロールバックされます。

reportDao.save()の新しいトランザクションを作成するときに失敗した場合でも、レポートを失敗としてマークできますreportDAO.markReportAsFailed()ReportDAO注釈が付けられているため、サービス メソッドから注釈を@Transactional削除するだけです。@Transactional実装を変更してreportDAO.save()、insert ステートメントをラップし、データベース レベルで例外をキャッチするデータベース関数またはストアド プロシージャを使用することもできます。

HTH。

于 2012-07-17T06:48:53.157 に答える