Spring事务介绍
Spring事务是指在Spring框架中对数据库操作进行管理的一种机制,它确保一组数据库操作要么完全执行成功(提交),要么完全不执行(回滚),从而保持数据一致性和完整性。
Spring框架提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。其中,声明式事务管理是通过在方法上添加@Transactional注解来实现的,通过简单的注解配置,开发者可以将业务逻辑与事务管理分离,使得代码更加清晰和易于维护。
失效原因
Spring事务失效可能由以下原因造成:
1、异常类型不匹配:Spring默认只回滚运行时异常(RuntimeException),如果抛出的是受检异常(checked exception),需要通过@Transactional(rollbackFor = Exception.class)明确指定。
2、手动捕获异常:如果在业务方法中手动捕获并处理了异常,Spring事务管理器无法感知到异常,导致无法回滚。可以通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();显式设置回滚。
3、非public方法:Spring声明式事务是基于动态代理实现的,非public方法无法被代理,因此事务不会生效。
4、方法内部调用:Spring代理的是接口或类,因此直接通过this调用同类中的方法不会走代理,事务不会生效。可以通过注入自身或通过AOP实现。
5、事务传播行为配置不当:@Transactional的propagation属性配置错误,如设置为Propagation.NOT_SUPPORTED,会导致事务失效。
6、数据库事务支持问题:如果使用的数据库或数据库驱动不支持事务,或者事务超时时间设置过短,也会导致事务失效。
7、Spring Bean未正确配置:类未添加@Service等注解,没有被Spring容器管理,事务也不会生效。
8、自定义切面顺序问题:如果自定义的切面和事务切面顺序相同,并且没有正确处理异常,也会导致事务失效。
9、父子容器问题:在Spring Boot中,如果父子容器扫描范围设置不当,可能会导致事务配置未被正确加载。