SpringJPA 多数据源事务管理及@Transactional失效的一些情况

项目搭建内容转载自 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;
		}
        
    }

还有其他的很多情况我暂时还没有遇到,希望大家补充。本人是新手,如果有错误还希望大家能够多多指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值