Spring事务的学习笔记

### 事务的特性:(什么叫做事务,说白了就是会回滚业务)
1、原子性:要么都成功,要么都失败。
2、一致性:事务的执行前后数据的完整性要一致。
3、隔离性:并发条件下不会出现脏读等现象。
4、持久性:提交了就是提交了,数据就修改成功了。

###事务的隔离级别:
1、默认(DEFAULT):是Spring框架根据不同的数据库来采用同的级别
2、READ_UNCOMMITED:允许读取还未提交的改变数据,可能导致脏读,幻读,不可重复读。
3、READ_COMMITTED:允许在并发事务已经提交后读取,可防止脏读,但是幻读和不可重复读仍然会发生。
4、REPEATABLE_READ:对相同字段的毒刺读取是一致的,除非事务被事务本身改变,可防止脏、不可重复读,但是幻读仍然会发生(Mysql是默认的这种状态)
5、SERIALIZABLE:完全服从ACID的隔离级别,确保不发生脏读,幻读,不可重复读,在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

###事务的传播行为
事务的传播行为是分以下这些,主要是三块
这里写图片描述

这些行为的用途和用法都分别对应的业务那些环境呢,简单分析下,用下图来说话
这里写图片描述

根据上图可以知道,这个业务层会有两个业务a和b,这两个业务都有自己的事务,那么,当我们在web层调用业务层的这两个方法的时候,对于a和b来说,自己本身有的有事务,有的没事务,但是针对web层同事调用来说具体使用a的事务还是b的事务就是个问题。所以才会有了事务的七种传播行为,,现在来具体的分析。

首先先来一个样例,这个样例明显的介绍了A服务和B服务的关系,如下图所示
这里写图片描述
其中 当我们使用A服务的时候,我们就同时调用了B服务。基于这个,我写了三个类,分别是A服务,B服务,测试类,

A服务类

B服务类

测试类

根据以上图片我们正好来测试一下事务传播的第一个

PROPAGATION_REQUIRED :
如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

注意:这段话说的是“当前”,也就是说这个事务的规定是相对而言的,相对上一层调用的来说,例如,A调用B,A规定了事务的,那么就用A的,如果A没有规定事务,那么B就自己单独起来一个事务。

PROPAGATION_SUPPORTS :
支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

这个一般都不用吧,都是需要事务来管理的

PROPAGATION_MANDATORY:
支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

这个用的也是比较少

PROPAGATION_REQUIRES_NEW:
创建新事务,无论当前存不存在事务,都创建新事务。

A调用B,无论A是什么事务,都创建新的事务,
这个还是比较重要的,基本都会用到

PROPAGATION_NOT_SUPPORTED:
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER:
以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED:
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

猜你喜欢

转载自blog.csdn.net/lovePaul77/article/details/79286388