【发布时间】:2016-12-06 21:04:04
【问题描述】:
我配置了 spring 和 hibernate 事务(每次服务调用的 aop 和 Throwable 的回滚)。我需要支持 cretePartA() 的以下要求:
- 不应使主事务失败,在我的示例中为 cteateSmth()
-
如果失败应该回滚它自己的事务
service1.cteateSmth();
/*started in new transaction*/ public void cteateSmth() { //...some other inserts // should not fail main transaction, // but shoud rollback it's own if is failed anotherService.cretePartA(); //should save state in db in any case recordSmthCreation(); } public void cretePartA(){ updateSubpartA(); updateSubPartA1(); if(!sucees) throw new ValidationException(); }
在上面的示例中,即使尝试对 cretePartA() 进行捕获包装,整个 cteateSmth() 事务也会被回滚。
我尝试使用 REQUIRES_NEW 进行此操作,但在这种情况下我似乎无法回滚 cretePartA() 操作。
TransactionDefinition transactionDefinition = new DefaultTransactionAttribute(TransactionDefinition.Propagation.REQUIRES_NEW);
new TransactionTemplate(transactionManager, transactionDefinition).execute(new TransactionCallback()
{
@Override
public Object doInTransaction(TransactionStatus status)
{
try{
cretePartA()
} catch (Exception e){
}
return null;
}
});
我试图不为 cretePartA() 创建新事务,只是超越了来自 spring aop 的这个服务调用。但在这种情况下,结果将提交给 cretePartA()。
【问题讨论】:
标签: java spring hibernate transactions spring-transactions