多线程事务的前提:同一个连接,同一个事务 之前做过 JPA的多线程事务 ,现在做MyBatis的多线程事务。 场景:多线程插入数据,其中一个插入操作出现异常,所有操作都要回滚 一般事务使用@Transactional来实现,但是多线程,使用@Transactional就无效了,还是跟之前的JPA的多线程事务 一样的原因,主要他们不是同一个连接,不是同一个事务,所以一个线程出现异常,回滚不会影响到其它线程
使用@Transactional,但是多线程事务失效的代码
- mapper,插入代码
- service代码
- 测试
多线程,要保持事务一致,只要一个出错,所有线程都要回滚。
看结果,一个线程是正常插入zhangsan,一个线程是异常插入lisi,
可以看到,多线程是事务并没有生效,一个线程报错,另一个却正常插入了,这不是我们想要的结果
使用sqlSession手动提交事务
只改controller,先看正常的效果
- 无异常的情况
两个线程都正常执行完成
正常插入
- 其中一个线程发生异常,所有线程回滚
只改这一点代码,将System.out.println(1/0);
打开,故意报错
无异常的线程正常结束,异常的线程抛出异常了
再查看两个线程的操作结果,都没有数据插入,正确回滚,多线程事务实现