私の問題は単純です。サービス メソッドの呼び出しによって発生したすべてのデータベースの変更をロールバックしたいと考えています。正しい注釈付けに問題があります。@Transactional
どこに配置し、どこに Propagation をREQUIRES_NEW
またはに設定すればよいか、よくわかりませんMANDATORY
。私が書いたコードを貼り付けます。これは、SQLException
スローされたという事実を除けば、 db changes をロールバックしません。
コード:
@Service
public class SwapInsertService {
@Autowired
MyDao myDao;
@Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class)
public void insertToManyTables(MyData data) throws SQLException {
insertToSpecificTables(data);
myDao.insertTwo(data);
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertToSpecificTables(MyData data) throws SQLException {
myDao.insertOne(data);
}
}
@Repository
public class MyDaoImpl implements MyDao {
@Transactional(propagation = Propagation.MANDATORY)
public void insertOne(MyData data) throws SQLException {
// INSERT
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertTwo(MyData data) throws SQLException {
// throws SQLException
}
}
insertTwo
throwsとしましょうSQLException
。以前の挿入をすべてロールバックしたいと思います。私は何を間違っていますか?
私の理解:
Propagation.REQURIES_NEW
新しいトランザクションを作成します。
Propagation.MANDATORY
現在のトランザクションをサポートします。
insertTwo
エラーをスローし、insertToManyTables
すべてをロールバックして、ほら。残念ながら、それはそれほど簡単ではありません。
編集CGLIB
:プロキシに使用していることに言及することが重要です。