spring–事务–02–事务参数设置

【摘要】 一、事务传播        事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为        传播属性是描述:同一线程中,事务嵌套时,事务如何管理spring的事务传播级别有七种,分为三类:1.1 必须要在事务里运行的事务级别    解释REQUIRED    如果当前存在事务,加入当前事务,否则创建新的。(spring默认)REQUIRES_NEW    …

一、事务传播

事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为
传播属性是描述:同一线程中,事务嵌套时,事务如何管理

spring的事务传播级别有七种,分为三类:
1.1 必须要在事务里运行的
事务级别 解释
REQUIRED 如果当前存在事务,加入当前事务,否则创建新的。(spring默认)
REQUIRES_NEW 如果当前存在事务,则挂起他,开启新的事物执行,新事务提交后再执行挂起的事务
MANDATORY 如果当前存在事务,加入当前事务,否则报错
NESTED 如果当前存在事务,使用嵌套事物执行,否则开启新事务
1.2 必须以非事务运行的
事务级别 解释
NOT_SUPPORTED 以非事务方式执行,如果当前存在事务,则挂起他
NEVER 以非事务方式执行,如果当前存在事务,则报错
1.3 有没有事物都可以运行的
事务级别 解释
SUPPORTS 当前存在事务就加入,没有就已非事务方式执行
1.4 事务传播使用举例

参考:Spring事务传播行为详解
二、事务隔离

多事务之间操作同一数据(即并发操作同一数据),相互隔离互不影响。如果不考虑隔离性,会产生脏读、不可重复读、虚(幻)读这三个读问题。

脏读:一个未提交事务读取到另一个未提交事务的数据
不可重复读:一个未提交事务读取到另一提交事务修改数据
虚读:一个未提交事务读取到另一提交事务添加数据

2.1 事务隔离级别

通过设置事务隔离级别,可解决读的3个问题。
(1)隔离级别如下图所示:

(2)数据库对于隔离属性的支持

Oracle不支持REPEATABLE_READ值如何解决?
Oracle采用多版本对比方式,解决不可重复读的问题

(3)默认隔离属性

spring中隔离属性默认值ISOLATION_DEFAULT,是指使用不同数据库所设置的默认隔离属性。

MySQL : REPEATABLE_READ
Oracle: READ_COMMITTED

(4)查看数据库默认隔离属性

三、timeout:超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是-1 ,表示不设置,采用对应数据库的值。设置时间以秒为单位进行计算

四、readOnly:是否只读

(1)读:查询操作,写:添加修改删除操作
(2)readOnly默认值false,表示可以查询,可以添加修改删除操作
(3)设置readOnly值是true,表示只能查询

五、rollbackFor:回滚

设置出现哪些异常进行事务回滚

六、noRollbackFor:不回滚

设置出现哪些异常不进行事务回滚

(1)Spring事务处理过程中:

默认对于RuntimeException及其子类采用的是回滚的策略
默认对于Exception及其子类采用的是提交的策略

用人话讲,就是:对try–catch处理了的异常,采用提交策略,未处理抛出去的异常,进行回滚

(2)rollbackFor使用方式–多个异常中间用逗号隔开

rollbackFor = {java.lang.Exception,xxx,xxx}

noRollbackFor = {java.lang.RuntimeException,xxx,xx}

(3)示例

@Transactional(rollbackFor = {java.lang.Exception.class},noRollbackFor= {java.lang.RuntimeException.class})

Exception :受检查的异常,这种异常是强制我们catch或throw的异常。你遇到这种异常必须进行catch或throw,如果不处理,编译器会报错。比如:IOException。
RuntimeException:运行时异常,这种异常我们不需要处理,完全由虚拟机接管。比如我们常见的NullPointerException,我们在写程序时不会进行catch或throw。
RuntimeException也是继承自Exception的,只是虚拟机对这两种异常进行了区分

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享