# 《Spring核心技术》第38章:深度解析Spring事务失效的八大场景
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-37 (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
大家好,我是冰河~~
本章难度:★★★☆☆
本章重点:掌握Spring事务失效的八大场景,并理解导致Spring事务失效的根本问题。
本章目录如下所示:
学习指引
失效场景
- 数据库不支持事务
- 事务方法未被Spring管理
- 方法没有被public修饰
- 同一类中方法调用
- 未配置事务管理器
- 方法的事务传播类型不支持事务
- 不正确的捕获异常
- 错误的标注异常类型
总结
思考
VIP服务
# 一、学习指引
明明配置了Spring事务,怎么就失效了呢?
在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。本章就简单总结下在哪些场景下Spring的事务会不生效。
# 二、失效场景
Spring事务在哪些场景下会失效呢?
有时候明明在项目中配置了Spring事务,但就是不生效,这是为什么呢?本节,就给大家介绍下Spring事务失效最常见的八大场景。
# 2.1 数据库不支持事务
Spring事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,则Spring的事务肯定会失效。例如,如果使用的数据库为MySQL,并且选用了MyISAM存储引擎,则Spring的事务就会失效。
# 2.2 事务方法未被Spring管理
如果事务方法所在的类没有加载到Spring IOC容器中,也就是说,事务方法所在的类没有被Spring管理,则Spring事务会失效,示例如下。
public class ProductService {
@Autowired
private ProductDao productDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateProductStockCountById(Integer stockCount, Long id){
productDao.updateProductStockCountById(stockCount, id);
}
}
2
3
4
5
6
7
8
ProductService类上没有标注@Service注解,Product的实例没有加载到Spring IOC容器中,就会造成updateProductStockCountById()方法的事务在Spring中失效。
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码