【问题标题】:Complete transaction with multiple dao in service class在服务类中使用多个 dao 完成事务
【发布时间】:2013-08-15 08:39:06
【问题描述】:

当一个服务类需要多个数据访问对象时,我如何实现一个完整的事务。假设我有以下结构。

目前,如果我的 dao2 失败,dao1 仍将提交到我不希望它发生的数据库。但是,我需要我的 DAO 是可重用的。

public class mainService(){
  dao1.store(obj1);
  dao2.store(obj2);
}

而我的道就是这样写的。

道1

private EntityManager entityManager;
@Transactional
public void store(Object obj1){
  entityManager.persist(obj1);
}

道2

private EntityManager entityManager;
@Transactional
public void store(Object obj2){
  entityManager.persist(obj2);
}

请帮忙。

【问题讨论】:

    标签: java spring hibernate jpa dao


    【解决方案1】:

    在一笔交易中实现这一点。

    @Transactional
    public void mainService(..){
      dao1.store(obj1);
      dao2.store(obj2);
    }
    

    只会创建一个事务,如果 dao2 失败,dao1 也不会被提交。并从store 方法中删除@Transactional。使数据库级别的方法具有事务性这不是一个好主意。在某些情况下,此级别可能会低两个。

    【讨论】:

      【解决方案2】:

      显而易见的答案是使用:

      private EntityManager entityManager;
      @Transactional
      public void store(Object obj1, Object obj2){
          entityManager.persist(obj1);
          entityManager.persist(obj2);
      }
      

      发生的事情是,您已经对使用 DAO 束手无策。 DAO死了!如果您查看 EntityManager API,您会注意到它实际上看起来非常像 DAO 类型的接口。因此,只需在您通常考虑使用 DAO 的地方直接使用它。

      【讨论】:

        【解决方案3】:

        在你的情况下,你也应该用@Transactional标记mainService(),因为事务传播规则默认是PROPAGATION_REQUIRED,然后dao1.store()和dao2.store()都在同一个事务下。没关系保持 dao1.store() 和 dao2.store() @Transactional,他们会意识到已经有事务然后加入事务。

        【讨论】:

        • 你的意思是像@Transactional(propagation = Propagation.REQUIRED) 这样的服务类吗?
        猜你喜欢
        • 2015-06-01
        • 2016-02-14
        • 2017-06-07
        • 2013-05-16
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 2011-08-23
        • 2011-08-14
        相关资源
        最近更新 更多