建设部网站投诉核查,怎么给wordpress加背景图,电子商务网站创业计划书,seo网站搭建一.抛出事务不支持的异常
原理#xff1a; Spring事务默认支持RuntimeException异常#xff0c;抛出的异常为RuntimeException异常及其子类异常事务均可生效#xff0c;而我们日常常见的异常基本都继承自RuntimeException#xff0c;所以无需指定异常类型事务也能生效。但…一.抛出事务不支持的异常
原理 Spring事务默认支持RuntimeException异常抛出的异常为RuntimeException异常及其子类异常事务均可生效而我们日常常见的异常基本都继承自RuntimeException所以无需指定异常类型事务也能生效。但若手动抛出Exception异常而Exception是RuntimeException的父类会导致事务不生效。 解决方案
1.指定Spring事务异常捕获类型
Transactional(rollbackFor Exception.class)2.抛出Spring事务支持的异常类型
throw new RuntimeException(手动抛出运行时异常);二.使用了try catch
原理 异常被try catch块捕获导致事务失效
解决方案
在catch中抛出Spring事务支持的异常。三.事务方法为私有方法
原理 Spring声明式事务基于动态代理实现private方法不能被代理事务不会生效。 此外static修饰的方法属于类不属于任何对象也不能被代理事务不生效。 final修饰的方法无法重写也就不能被代理事务也不会生效。
解决方案
方法用public修饰不要用static、final修饰四.类未被Spring管理
原理 Spring实现对象的动态代理首先这个对象要交由Spring管理。
解决方案
将类交由Spring管理可添加Service注解或使用其他能够注册成Spring Bean的注解或方法。五.一个方法调用本类另一个方法事务失效
原理 Transactional基于AOP实现而AOP又是基于动态代理实现直接调用本类方法或使用this调用本类方法均不是Spring的代理对象无法实现动态代理事务也就不会生效。
解决方案
1.将两个方法合并为一个方法用Transactional修饰。
2.将被调用的方法放到另一个被Spring管理的类中用实例对象调用
3.用Autowired在本类中注入本类实例再用注入的实例对象调用该方法。
4.手动获取本类的代理用代理调用该方法((TestService)AopContext.currentProxy()).myTest();六.数据表不支持事务
原理 Spring事务基于数据库事务实现有些数据表本身不支持事务如MySql的MyISAM引擎事务自然不生效。
解决方案
将数据表改用支持事务的引擎如MySql的InnoDB引擎。七.Spring事务传播级别设置为不支持事务
原理 Transactional(propagation Propagation.NOT_SUPPORTED) 不支持事务若存在事务则挂起 Transactional(propagation Propagation.NEVER) 不使用事务若存在事务则抛异常
解决方案
使用Spring默认的传播级别(PROPAGATION_REQUIRED)或其他支持事务的传播级别。八.未开启事务
解决方案
EnableTransactionManagement开启事务Spring boot已自动装配无需显示使用此注解。九.多线程调用
原理 不同线程使用不同的数据库链接基于同一数据库连接的事务才能同时提交或回滚因此事务不生效。
原文地址https://blog.csdn.net/secretdaixin/article/details/127805326