提示:文章先作为初版,等后续时间充足后,补充更深的内容
文章目录
Spring的事务
一、spring事务的实现方式原理
在使用Spring框架的时候,可以有两种事务的实现方式,一种是编程式事务,有用户自己通过代码来控制事务的处理逻辑,还有一种是声明式事务,通过@Transactional注解来实现。
其实事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般我们很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。
其实事务操作是AOP的一个核心体现,Spring事务在默认情况下使用CGLIB库来生成代理对象,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交,如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。
1、spring事务的隔离级别
spring中的事务隔离级别就是数据库的隔离级别,有以下几种:
一、READ UNCOMMITTED 读取未提交内容
二、*READ COMMITTED 读取提交内容
三、*REPEATABLE READ 可重复读
四、SERIALIZABLE 可串行化
在进行配置的时候,如果数据库和spring代码中的隔离级别不同,那么以spring的配置为主。
二、传播机制介绍
多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性,来保证事务的正常执行:
REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务
SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行
MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常
REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起改事务
NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务
NEVER:不使用事务,如果当前事务存在,则抛出异常
NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样
1、 NESTED和REQUIRED_NEW的区别
REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关,而NESTED则是当前存在事务时会开启一个嵌套事务,在NESTED情况下,父事务回滚时,子事务也会回滚,而REQUIRED_NEW情况下,原有事务回滚,不会影响新开启的事务
2、NESTED和REQUIRED的区别
REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。
三、spring事务什么时候会失效
自调用问题:当一个方法在同一个类中通过this关键字进行自调用时,事务的代理不会生效。这是因为Spring事务是基于AOP实现的,通过代理类来管理事务。解决方法是确保自调用的方法通过代理对象调用,而不是直接通过this关键字调用。
非public方法问题:默认情况下,Spring事务只能应用于public方法。如果想在非public方法上使用事务,需要开启AspectJ代理模式。通过在Spring配置中设置<tx:annotation-driven mode=“aspectj”/>,可以使用AspectJ框架来实现事务的代理。
数据库不支持事务:某些数据库可能不支持事务,或者事务的隔离级别有限制。如果在不支持事务的数据库上使用事务,事务将无效。需要确保使用的数据库引擎支持事务,并根据需要设置正确的事务隔离级别。
没有被Spring管理:Spring事务只对由Spring容器管理的Bean起作用。如果一个类实例不是由Spring容器管理,那么事务将不会被应用。确保相关的类被正确地声明为Spring Bean,并由Spring容器进行管理。
异常被吞掉或未定义:默认情况下,Spring事务只会在遇到未被捕获的RuntimeException及其子类时回滚事务。如果异常被捕获并处理,或者抛出的异常没有被定义为RuntimeException,事务将不会回滚。确保在事务方法中适当地抛出RuntimeException或进行异常处理,以确保事务可以回滚。

1886




被折叠的 条评论
为什么被折叠?



