如何实现服务类需要多个数据访问对象的完整事务。假设我有以下结构。
目前,如果我的dao2失败,dao1仍然被提交到数据库,我不希望它发生。但是,我需要我的DAO可以重复使用。
public class mainService(){
dao1.store(obj1);
dao2.store(obj2);
}
我的dao是用这种方式写的。
Dao 1
private EntityManager entityManager;
@Transactional
public void store(Object obj1){
entityManager.persist(obj1);
}
Dao 2
private EntityManager entityManager;
@Transactional
public void store(Object obj2){
entityManager.persist(obj2);
}
请帮忙。
答案 0 :(得分:2)
在一次交易中实现这一点。
@Transactional
public void mainService(..){
dao1.store(obj1);
dao2.store(obj2);
}
只会创建一个事务,如果dao2失败,也不会提交dao1。并从@Transactional
方法中删除store
。使DB级方法具有事务性,这不是一个好主意。在某些情况下,这个水平可能会低两个。
答案 1 :(得分:0)
显而易见的答案是使用:
private EntityManager entityManager;
@Transactional
public void store(Object obj1, Object obj2){
entityManager.persist(obj1);
entityManager.persist(obj2);
}
发生的事情是你已经开始使用DAO了。 DAO死了!如果你看一下EntityManager API,你会发现它实际上看起来非常像DAO类型的接口。因此,只需在通常考虑使用DAO的地方直接使用它。
答案 2 :(得分:0)
在你的情况下,你应该用@Transactional标记mainService(),因为事务传播规则默认是PROPAGATION_REQUIRED,然后dao1.store()和dao2.store()都在同一个事务下。它没关系保持dao1.store()和dao2.store()@ Transaction,他们会意识到已经有了一个事务,然后加入了这个事务。