1 优秀文章合集
1.1 @Transactional注解如果想要生效,需要调用被Spring动态代理后的类实例的方法
1.2
发现Spring事务的一个实锤bug,官方还拒不承认?你来评评理...
当 Spring 遇到该注解时,会自动从数据库连接池中获取 connection,并开启事务然后绑定到 ThreadLocal 上,对于@Transactional注解包裹的整个方法都是使用同一个connection连接。如果我们出现了耗时的操作,比如第三方接口调用,业务逻辑复杂,大批量数据处理等就会导致我们我们占用这个connection的时间会很长,数据库连接一直被占用不释放。一旦类似操作过多,就会导致数据库连接池耗尽。
在一个事务中执行RPC操作导致数据库连接池撑爆属于是典型的长事务问题,类似的操作还有在事务中进行大量数据查询,业务规则处理等...
震惊,Spring官方推荐的@Transactional还能导致生产事故?
长事务引发的常见危害有:
-
数据库连接池被占满,应用无法获取连接资源;
-
容易引发数据库死锁;
-
数据库回滚时间长;
-
在主从架构中会导致主从延时变大。
几个常见的事务不生效的场景为:
“
@Transactional 应用在非 public 修饰的方法上
@Transactional 注解属性 propagation 设置错误
@Transactional 注解属性 rollbackFor 设置错误
同一个类中方法调用,导致@Transactional失效
异常被catch捕获导致@Transactional失效