当前位置: 首页 > 知识库问答 >
问题:

Spring回滚事务部分

曾翰飞
2023-03-14

我有Spring

>

  • 不应该失败主事务,在我的例子中是cteateSmth()
  • 如果失败,应该回滚它自己的事务

    service1.cteatsmth();

    /*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()发送结果。

  • 共有1个答案

    曹凯泽
    2023-03-14

    我通过对cretePartA()方法和try/catch块的注释@Transactional(propagation=propagation.REQUIRES_NEW)解决了这个问题

     类似资料:
    • -ZJ 以下是我在Application.Properties中的数据源设置:

    • 我列出了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入到数据库表中。 我的事务配置: 我的服务和dao定义如下:

    • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

    • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:

    • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?

    • Spring 4.1.4 Hibernate 4.2.0 JDK 1.8 我的上下文:我有一个控制器调用-->Service-->调用Dao业务功能是删除(在1到许多DB关系中)一些子级,但不是所有子级。然后,在删除了一些子项之后,我尝试删除父项,然后我得到了java.sql.SqlIntegrityConstraintViolationException