spring事务隔离级别与传播机制

隔离级别:

1、ISOLOCATION_DEFAULT: 数据库默认级别
2、ISOLOCATION_READ_UNCOMMITTED: 允许读取未提交的读, 可能导致脏读,不可重复读,幻读 (直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别的事务可以读到这个改变.这是很不安全的. 效率最高 但不安全)
3、ISOLOCATION_READ_COMMITTED: 允许读取已提交的读,可能导致不可重复读,幻读 (直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后别的事务就能读到这个改变.)
4、ISOLOCATION_REPEATABLE_READ : 不能能更新另一个事务修改单尚未提交(回滚)的数据,可能引起幻读(直译就是"可以重复读",这是说在同一个事务里面先后执行同一个查询语句的时候,得到的结果是一样的.)
5、ISOLOCATION_SERIALIZABLE: 序列执行效率低(直译就是"序列化",意思是说这个事务执行的时候不允许别的事务并发执行. 效率最低)

传播级别(事务传播 - Propagation)

1、MANDATORY: 方法必须运行在一个事务中,不存在事务则抛出异常
释义:当前方法运行时,必须要有事务(当前方法有事务或者调用方有事务),没有则抛异常。
2、NESTED:  存在事务则运行在嵌套事务中,不存在则创建一个事务
释义:如果当前有事务则开启子事务(嵌套事务),如果当前没有事务,则同REQUIRED

     如果主事务提交,则会携带子事务一块提交,
     如果主事务回滚,则子事务一块回滚,相反 如果子事务异常回滚,则父事务可以回滚或不回滚

3、NEVER: 当前方法不能运行在事务中,存在事务则抛出异常
4、NOT_SUPPORT: 当前存在事务则将其 挂起
释义:当前有没有事务都不执行事务,(有事务 改为挂起状态)。
5、REQUIRED: 不存在事务则创建一个事务 ( @Transactional 默认的事务隔离级别)
释义: 使用当前事务,如果当前没有事务,创建一个新的事务;子方法必须运行在一个事务里面,如果当前子方法存在事务则加入到这个事务中,成为一个整体。
6、REQUIRES_NEW: 新建一个自己的事务,不论当前是否存在事务的
假设:B方法为父级(调用方) A方法为当前方法
释义:

      ① 如果B方法 没有事务或者处以被挂起状态, A方法有REQUIRES_NEW注释的方法;A方法内抛出异常,则B方法不会回滚,A方法会回滚
      ② 如果B方法有事务, A方法有REQUIRES_NEW注释的方法;A方法内抛出异常,则 A B方法都会回滚
      ③ 如果B方法有事务, A方法有REQUIRES_NEW注释的方法;B方法内抛出异常,则  B方法都会回滚, A方法不回滚
      ④ 如果A B 方法都被 REQUIRED修饰,则A B方法的事务为一体,无论 A或者 B抛出异常 ,事务都回滚。

7、SUPPORT: 存在事务则加入,不存在也可以
释义:有事务加入事务 没有则不不使用

示例说明

@Transactional(propagation = Propagation.REQUIRED)

事务传播 - Propagation
	REQUIRED: 使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的;
	          如果当前存在事务,则加入这个事务,成为一个整体。
	          举例:领导没饭吃,我有钱,我会自己买了自己吃;领导有的吃,会分给你一起吃。
	SUPPORTS: 如果当前有事务,则使用事务;如果当前没有事务,则不使用事务。
	         举例:领导没饭吃,我也没饭吃;领导有饭吃,我也有饭吃。
	MANDATORY: 该传播属性强制必须存在一个事务,如果不存在,则抛出异常
	          举例:领导必须管饭,不管饭没饭吃,我就不乐意了,就不干了(抛出异常)
	REQUIRES_NEW: 如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;
	             如果当前没有事务,则同 REQUIRED
	              举例:领导有饭吃,我偏不要,我自己买了自己吃
	NOT_SUPPORTED: 如果当前有事务,则把事务挂起,自己不适用事务去运行数据库操作
	              举例:领导有饭吃,分一点给你,我太忙了,放一边,我不吃
	NEVER: 如果当前有事务存在,则抛出异常
	       举例:领导有饭给你吃,我不想吃,我热爱工作,我抛出异常
	NESTED: 如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;
	      如果当前没有事务,则同 REQUIRED。
	      但是如果主事务提交,则会携带子事务一起提交。
	       如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。(try catch 捕获不会回滚)
	      举例:领导决策不对,老板怪罪,领导带着小弟一同受罪。小弟出了差错,领导可以推卸责任。

@Transactional属性

 
属性类型描述
valueString可选的限定描述符,指定使用的事务管理器
propagationenum: Propagation可选的事务传播行为设置
isolationenum: Isolation可选的事务隔离级别设置
readOnlyboolean读写或只读事务,默认读写
timeoutint (in seconds granularity)事务超时时间设置
rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组
指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")
指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值