1

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

目前,如果我的 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);
}

请帮忙。

4

3 回答 3

3

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

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

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

于 2013-08-15T08:53:41.703 回答
0

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

于 2013-08-15T08:56:11.717 回答
0

显而易见的答案是使用:

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

发生的事情是你已经对使用 DAO 感到厌烦了。DAO死了!如果您查看 EntityManager API,您会注意到它实际上看起来非常像 DAO 类型的接口。所以只要在你通常考虑使用 DAO 的地方直接使用它。

于 2013-08-15T08:49:44.563 回答