spring boot 线程回滚_Spring 事务笔记

Transactional注解不生效

  1. 检查你方法是不是public的,不能作用在方法里的任何内部方法。
  2. 数据库是否支持事务,比如mysql中innodb引擎支持事务,myisam引擎不支持事务。
  3. 检查异常是否被catch了。

优先级顺序为:方法>类>接口;

推荐在类的实现类使用。在接口使用如果是CGLIB,根据CGLIB代理模式,接口的注解不能被继承。

Spring事务4种隔离级别

read-uncommit : 两个事务,事务A修改了数据d,未提交,事务B能感知数据d的变化。

read-commit :事务A修改了数据d,提交了之后事务B才能感知数据d的变化。

repeatable-read :事务A修改了数据d,提交了之后,事务B仍然未能感知数据d的变化。

serializable :事务A在修改数据d时,未提交,事务B是无法访问数据d。(一个数据不能同时有两个事务操作,只能一个一个地操作。这就是串行)

read uncommit < read commit < repeatable read < serializable.

从左往右:一致性越来越强,性能越来越低。

Spring事务7种传播行为

propagation_required : 需要,存在事务就加入,否则创建事务。

propagation_supports: 支持,存在事务就加入,否则不创建事务。

propagation_mandatory:强制,存在事务就加入,否则抛异常。

propagation_required_new :需要新的,存在事务就创建新的,否则也创建新的。

propagation_not_supported:不支持,存在事务就挂起,否则不是事务。

propagation_never:坚决不,存在事务就抛异常,否则不是事务。

propagation_nested:内嵌,存在事务就内嵌,否则创建新的(外部有保存点)。

Spring如何确保开启事务的连接mybatis连接数据库使用的连接是同一个?

(如果不是同一个,那开启事务等于白开,有可能多个操作用的不是开启事务的那个连接)

目的:在一个线程下,一个事务的多个操作拿到的是同一个连接。

主要在TransactionSynchronizationManager里用ThreadLocal线程本地绑定connection。

bindResource(DataSource,ConnectionHolder)绑定以DataSource为key,ConnectionHolder为value的map到ThreadLocal线程本地。

getResource(DataSource) 然后mybatis根据DataSource就可以取得到Connection。

每个线程有一个线程本地map(ThreadLocalMap)。

解决思路:把connection与线程捆绑,一个线程最多能有一个connection,在一个线程内的一切操作都是在绑定当前线程的连接上操作的。

Spring为什么只能是单线程事务?多线程不行吗?

多线程失效案例:

一开始用jmeter开超过tomcat最大线程数并发请求,结果事务还是回滚了,所以这个还是可用的。 所以方法外多线程调用事务是安全的。

然后在方法里加入多线程处理,如下,

@Override

subMoney方法绝对会抛异常,所以这里事务要回滚的是setAge。

启动访问后,这里甚至没有报错。。。(没加多线程前是必定输出报错的,而且也会返回出错信息,但是现在没有。

v2-21b7d97cdcc18821e8e6f4f7a6516291_b.png
单线程事务报错1

v2-773835405cca89e150e2ab33cfe655c6_b.jpg
单线程事务报错2

多线程:

v2-fbf0a45d3c604b119a77a3b277a21d9b_b.jpg

v2-0f6fccec9bf3230b5509b9cf290dcff2_b.jpg

v2-3f4fe3563fd7493fb3b4fa7e82f4f7bc_b.jpg

查遍这个日志,并没有找到报错的。

v2-e67ff378f640669d5f8b9ca98e8ddebb_b.jpg

现象:注意这个 “”age“”字段,每次调用都会增加,说明该操作没有回滚。

解释:这是因为Spring的开启事务的连接是线程(ThreadLocal)私有的,每个线程不一定有事务。当没有事务的线程执行了操作,这是非事务的操作,不安全操作,异常不会回滚。

总结:在方法内的多线程操作,Spring会出现事务失效问题。但是方法外的多线程访问是没问题的。(jmeter多线程测试)

参考文章:

spring事务详解(五)总结提高 - 只会一点java - 博客园

spring管理mybatis事务的保证数据库连接唯一的原理 - 心藏三叶生一花 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值