🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、不使用事务 所谓不使用事务,也可以意味着事务在每条语句上,每次执行,都会直接提交;因为@Transactional实质上,就是通过代理的方式,控制当前方法执行前,关闭自动提交;查询源码就能看到,beginTransaction里面,最底层,就是调用的数据库驱动TransactionDriver的begin();就关闭了当前事务自动提交; 单条语句执行的业务方法,就不必使用事务了; ## 二、查询中事务 查询业务中,一般不需要启用事务; ## 三、一个方法多个事务 如果方法涉及多次数据库操作,并希望将它们作为独立的事务进行提交或回滚,那么我们需要考虑进一步细化配置事务传播方式,也就是 @Transactional 注解的Propagation 属性,可达到目的; ## 四、尽量避免长事务 如果事务耗时过长,只有等事务结束之后,DB连接才会释放,此类长时间占用DB连接的称为长事务。一旦外部有大量请求就会造成连接池爆满。这种情况会导致访问速度很快的请求被阻塞。查看jstack会发现很多速度很快的请求被阻塞; ## 五、事务中需规避的问题 * 减少慢查询 * 事务不应该包含任何RPC调用,HTTP调用,IO操作,减少事务粒度,避免长事务; * 服务消息队列不应该放在事务内,而且消息队列组件等需要设置超时时间; * 跨库、跨库类型如redis,不应该放同一个事务,避免交叉感染;