Spring事务的隔离级别跟传播属性

SpringBoot项目开启事务:启动类加上@EnableTransactionManagement注解

事务方法调用非事务方法:https://blog.csdn.net/u010235716/article/details/90171802

一、隔离级别

1) DEFAULT (默认) 
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
2) READ_UNCOMMITTED (读未提交) 
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 
3) READ_COMMITTED (读已提交) 
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 
4) REPEATABLE_READ (可重复读) 
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
5) SERIALIZABLE(串行化) 
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。 

一、传播属性(Propagation)

1) required(REQUIRED)(默认属性)
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。 

2) mandatory(MANDATORY )
支持当前事务,如果当前没有事务,就抛出异常。 
3) never(NEVER )
以非事务方式执行,如果当前存在事务,则抛出异常。 
4) not_supported(NOT_SUPPORTED )
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
5) requires_new(REQUIRES_NEW )
新建事务,如果当前存在事务,把当前事务挂起。 
6) supports(SUPPORTS )
支持当前事务,如果当前没有事务,就以非事务方式执行。 
7) nested(NESTED )
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 
PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:
它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。

三、spring的scope有几种

singleton: 在Spring的IoC容器中只存在一个对象实例,所有该对象的引用都共享这个实例Spring 容器只会创建该bean定义的唯一实例,这个实例会被保存到缓存中,并且对该bean的所有后续请求和引用都将返回该缓存中的对象实例,一般情况下,无状态的bean使用该scope。

prototype:每次对该bean的请求都会创建一个新的实例,一般情况下,有状态的bean使用该scope。
request:每次http请求将会有各自的bean实例,类似于prototype。
session:在一个http session中,一个bean定义对应一个bean实例。
global session:在一个全局的http session中,一个bean定义对应一个bean实例。典型情况下,仅在使用portlet context的时候有效。

其次说明spring的默认scope(bean作用域)是singleton

非事务方法调用事务方法事务会生效吗?

不会的,因为同一个类中非事务方法调用方法时用的是当前对象去调用,而不是spring生成的代理对象,所以会导致事务失效。

解决方法:

1、使用 AopContext.currentProxy() 获取代理对象

2、springboot启动类加上注解:@EnableAspectJAutoProxy(exposeProxy = true)

猜你喜欢

转载自blog.csdn.net/qq_43037478/article/details/114868870
今日推荐