一、事务传播
- 事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为
- 传播属性是描述:同一线程中,事务嵌套时,事务如何管理
spring的事务传播级别有七种,分为三类:
1.1 必须要在事务里运行的
事务级别 | 解释 |
---|---|
REQUIRED | 如果当前存在事务,加入当前事务,否则创建新的。(spring默认) |
REQUIRES_NEW | 如果当前存在事务,则挂起他,开启新的事物执行,新事务提交后再执行挂起的事务 |
MANDATORY | 如果当前存在事务,加入当前事务,否则报错 |
NESTED | 如果当前存在事务,使用嵌套事物执行,否则开启新事务 |
1.2 必须以非事务运行的
事务级别 | 解释 |
---|---|
NOT_SUPPORTED | 以非事务方式执行,如果当前存在事务,则挂起他 |
NEVER | 以非事务方式执行,如果当前存在事务,则报错 |
1.3 有没有事物都可以运行的
事务级别 | 解释 |
---|---|
SUPPORTS | 当前存在事务就加入,没有就已非事务方式执行 |
1.4 事务传播使用举例
二、事务隔离
多事务之间操作同一数据(即并发操作同一数据),相互隔离互不影响。如果不考虑隔离性,会产生脏读、不可重复读、虚(幻)读这三个读问题。
- 脏读:一个未提交事务读取到另一个未提交事务的数据
- 不可重复读:一个未提交事务读取到另一提交事务修改数据
- 虚读:一个未提交事务读取到另一提交事务添加数据
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的,只是虚拟机对这两种异常进行了区分