详细:
在方法上添加@Transactional注解来开启事务, 有多个可配置选项用于控制事务的行为
可指定的配置选项:
- rollbackFor属性指定事务回滚的规则
- DEFAULT:利用数据库的默认隔离级别。
- READ_UNCOMMITTED:允许读取未提交的数据。
- READ_COMMITTED:只能读取已提交的数据。
- REPEATABLE_READ:确保在同一事务中多次读取相同数据时结果一致。
- SERIALIZABLE:最高隔离级别,确保事务串行执行。
- isolation指定事务的隔离级别
- DEFAULT:利用数据库的默认隔离级别。
- READ_UNCOMMITTED:允许读取未提交的数据。
- READ_COMMITTED:只能读取已提交的数据。
- REPEATABLE_READ:确保在同一事务中多次读取相同数据时结果一致。
- SERIALIZABLE:最高隔离级别,确保事务串行执行。
- propagation指定事务的传播行为
- REQUIRED(默认):如果当前存在事务,则加入该事务;如果不存在,则创建一个新事务。
- REQUIRES_NEW:总是创建一个新事务,如果当前存在事务,则挂起当前事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果不存在,则以非事务方式执行。
- NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务。
- MANDATORY:如果当前存在事务,则加入该事务;如果不存在,则抛出异常。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在嵌套事务中执行;如果不存在,则创建一个新事务。
- timeout定义事务的超时时间(单元:秒)。如果事务在指定时间内未完成,则主动回滚。
事务失效的环境:
由于Spring的事务管理通过AOP实现, 因此所有可以大概导致AOP动态代理失效的环境通常都会导致事务失效,
如:
- 非public方法、静态方法或 final 方法:Spring AOP默认只能代理public方法,也无法代理静态方法或final方法。
- 自调用:在同一个类中,一个方法调用另一个带有注解的方法时,属于内部调用,不会经过代理对象,而是利用this直接调用目标方法。
- 代理模式配置错误:Spring默认利用JDK动态代理,如果目标类没有实现接口,代理将无法生效。
- 手动创建对象:如果通过new关键字手动创建对象,而不是通过Spring容器管理,AOP代理不会生效
- 方法被异步调用:如果事务方法被异步调用(例如通过@Async),代理可能不会生效,因为异步方法通常在不同的线程中执行。
- AOP配置错误:如切点表达式不匹配
除此之外, 还能导致事务失效的环境有:
- 异常没有被抛出
- @Transactional默认只在遇到RuntimeException和Error时回滚。如果方法捕获了异常而且没有重新抛出,事务不会回滚。
- 事务的属性配置错误
- Propagation.NOT_SUPPORTED会挂起当前事务。
- Propagation.NEVER会在存在事务时抛出异常。
- 数据库或表不支持事务
- Spring 事务是对数据库事务的封装和增强, 底层实现完全依赖于数据库的事务支持。无论是单数据源还是多数据源,Spring终极都是通过调用数据库的事务API(如 JDBC 的Connection、 JPA 的EntityManager等)来开启、提交或回滚事务。
- 事务管理器和数据源配置有误
- 方法中利用了非事务性操作
- 如文件操作、网络请求等, 这些操作不会受到事务管理
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |