项目搭建内容转载自 SpringBoot+JPA+EntityManage实现多数据源多事务处理_瑾析编程的博客-CSDN博客
文中案例按照上文搭建项目,更改了表结构。并根据新的表结构重新写了service类。
@Transactional失效案例:
(1)@Transactional注解未标明使用的事务管理器。
@Service
public class testService {
@PersistenceContext(unitName = "firstPersistenceUnit")
EntityManager firstEntityManager;
@PersistenceContext(unitName = "secondPersistenceUnit")
EntityManager secondEntityManager;
@Autowired
FirstRepository firstRepository;
@Autowired
SecondRepository secondRepository;
@Transactional // 注解失效,无法控制事务。因为操作的是第二数据源,所以需要指明使用第二数据源的事务管理器。如果未指明事务管理器,则默认使用主数据源的事务管理器。(@Primary)
public void saveSecond2(){
Second second = new Second();
second.setId("1");
second.setAge("年龄是2");
secondRepository.save(second);
Second second2 = new Second();
second2.setId("2");
second2.setAge("年龄是3");
secondRepository.save(second2);
int i = 10/0;
}
}
正确写法:
@Transactional(value = "secondTransactionManager", rollbackFor = Exception.class)
public void saveSecond2(){
Second second = new Second();
second.setId("1");
second.setAge("年龄是2");
secondRepository.save(second);
Second second2 = new Second();
second2.setId("2");
second2.setAge("年龄是3");
secondRepository.save(second2);
int i = 10/0;
}
(2)在一个事务中同时对两个数据源进行操作,事务控制失效。
@Transactional
public void saveTwoDatasource(){
First first = new First();
first.setId("1");
first.setName("姓名1,数据源1");
firstRepository.save(first);
Second second2 = new Second();
second2.setId("2");
second2.setAge("年龄2,数据源2");
secondRepository.save(second2);
int i = 10/0;
}
(3)异常被捕获,无法被切面感知。
@Transactional
public void saveTwoDatasource(){
try{
First first = new First();
first.setId("1");
first.setName("姓名1,数据源1");
firstRepository.save(first);
Second second2 = new Second();
second2.setId("2");
second2.setAge("年龄2,数据源2");
secondRepository.save(second2);
int i = 10/0;
}catch(Exception e) {
// do nothing;
}
}
还有其他的很多情况我暂时还没有遇到,希望大家补充。本人是新手,如果有错误还希望大家能够多多指正,谢谢!