我在我的项目中做过类似的事情。 我手动回滚事务,因为我已插入try-catch块并在catch块中手动回滚事务。 现在我从method1调用method2,我在method2()中将对象保存到数据库,但它没有将对象保存到数据库。
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
@Scheduled(cron = "0 5 16 * * ?")
public void method1() {
try{
---try block---
}
catch(Throwable t){
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
method2();
}
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void method2() {
---saving object to database----
someService.update(object);
}
我只是想知道在method1()的faliure上将method2()中的对象保存为可能的解决方案。
提前完成。
答案 0 :(得分:0)
我相信一旦事务被回滚(就像你在调用method2()之前那样)事务就完成了(就像在kaput中一样)并且你不能继续使用它并期望提交。这需要是一个新的交易(例如程序化):
// transactionManager is your platorm transaction manager usually injected
TransactionTemplate transactionTempate = new TransactionTemplate(transactionManager);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
method2();
}
});