【问题标题】:How to fix Spring transaction rollback not working while exception如何修复 Spring 事务回滚在异常时不起作用
【发布时间】:2022-12-14 06:26:37
【问题描述】:

我有一项服务试图保留两个实体。我的期望是,如果一个实体未能持久化,则应回滚而不是持久化另一个实体。但是一个是持久的,而另一个不是。 这是我的服务等级

@Service
@Transactional(value = "db1TransactionManager")
public class ServiceImpl {

    @Override
    @Transactional
    public void insertOrUpdate(Entity1 entity1, Entity2 entity2) {
        db1Repository.insert(entity1, Entity1.class);
        db1Repository.insert(entity1, Entity2.class);
    }
}

这是我的存储库类

@Transactional(value = "db1TransactionManager")
@Repository(value = "db1Repository")
public class Db1RepositoryImpl {

    @PersistenceContext(unitName = "db1")
    private EntityManager em;

    @Override
    public <T> void insert(T entity, Class<T> tClass) {
        em.persist(entity);
//        em.flush();
    }
}

我故意将 entity2 设置为 null 以检查回滚是否有效,但 entity1 仍然存在。我如何使这个事务原子化?

【问题讨论】:

    标签: java spring-boot hibernate transactions


    【解决方案1】:

    根据spring事务传播机制

    默认为PROPAGATION_REQUIRED

    我们要么一起成功,要么一起失败

    到目前为止你看起来更像PROPAGATION_NESTED

    换句话说,这两个插入不在同一个事务中

    【讨论】:

      【解决方案2】:

      我不确定为什么会发生这种情况,但最终通过从存储库中删除 @Transactional(value = "db1TransactionManager") 并将其放在方法之上来解决问题。还将其从类服务级别中删除。 仍在寻找适当的解释。 所以这就是它现在的样子

      @Service
      public class ServiceImpl {
      
          @Override
          @Transactional(value = "db1TransactionManager")
          public void insertOrUpdate(Entity1 entity1, Entity2 entity2) {
              db1Repository.insert(entity1, Entity1.class);
              db1Repository.insert(entity1, Entity2.class);
          }
      }
      

      @Repository(value = "db1Repository")
      public class Db1RepositoryImpl {
      
          @PersistenceContext(unitName = "db1")
          private EntityManager em;
      
          @Override
          public <T> void insert(T entity, Class<T> tClass) {
              em.persist(entity);
      //        em.flush();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-14
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        相关资源
        最近更新 更多