私の問題は単純です。サービス メソッドの呼び出しによって発生したすべてのデータベースの変更をロールバックしたいと考えています。正しい注釈付けに問題があります。@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
}
}
insertTwothrowsとしましょうSQLException。以前の挿入をすべてロールバックしたいと思います。私は何を間違っていますか?
私の理解:
Propagation.REQURIES_NEW新しいトランザクションを作成します。
Propagation.MANDATORY現在のトランザクションをサポートします。
insertTwoエラーをスローし、insertToManyTablesすべてをロールバックして、ほら。残念ながら、それはそれほど簡単ではありません。
編集CGLIB:プロキシに使用していることに言及することが重要です。