Spring回滚事务部分
Spring rollback transaction part
我配置了 spring 和休眠事务(在每个服务调用上执行 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()。
我用注解解决了@Transactional(propagation = Propagation.REQUIRES_NEW)
对于 cretePartA() 方法和 try/catch 块
我配置了 spring 和休眠事务(在每个服务调用上执行 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()。
我用注解解决了@Transactional(propagation = Propagation.REQUIRES_NEW)
对于 cretePartA() 方法和 try/catch 块