开发者社区> 游客lvl37ub5rpclk> 正文

Spring 事务【隔离级别与传播机制】

简介: Spring 事务【隔离级别与传播机制】
+关注继续查看

🍎一.事务隔离级别

🍒1.1 事务特性回顾


事务有4 大特性(ACID),原子性、持久性、?致性、隔离性

?

具体概念如下:

● 原子性:?个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执?过程中发?错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执?过?样

?

● 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写?的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以?发性地完成预定的?作

?

● 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

?

● 隔离性:数据库允许多个并发事务同时对其数据进?读写和修改的能?,隔离性可以防?多个事务并发执?时由于交叉执??导致数据的不?致。事务隔离分为不同级别,包括读未提交(Readuncommitted)、读提交(read committed)、可重复读(repeatable read)和串?化(Serializable)


上? 4 个属性,可以简称为ACID


原子性(Atomicity,或称不可分割性)
—致性(Consistency)
隔离性(lsolation,又称独立性)
持久性( Durability) 


🍒1.2 事务的隔离级别(5种)


设置事务的隔离级别是?来保障多个并发事务执?更可控,更符合操作者预期的

?事务的隔离级别就是为了防?,其他的事务影响当前事务执?的?种策略


Spring 中事务隔离级别可以通过 @Transactional 中的 isolation 属性进?设置,具体操作如下图所示:

9aee931243d14139922101bff685454c.png


** Spring 中事务隔离级别包含以下 5 种:**


  1. Isolation.DEFAULT:以连接的数据库的事务隔离级别为主(默认)
  2. Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读
  3. Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读
  4. Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)
  5. Isolation.SERIALIZABLE:串?化,可以解决所有并发问题,但性能太低


从上述介绍可以看出,相?于 MySQL 的事务隔离级别,Spring 的事务隔离级别只是多了?个Isolation.DEFAULT(以数据库的全局事务隔离级别为主)


🍒1.3 事务隔离级别的设置


Spring 中事务隔离级别只需要设置 @Transactional ?的 isolation 属性即可,具体实现代码如下:

@RequestMapping("/save")
@Transactional(isolation = Isolation.SERIALIZABLE)
public Object save(User user) {
  // 业务实现
}

🍎二.Spring 事务传播机制

🍒2.1 Spring 事务传播机制的作用


Spring 事务传播机制定义了多个包含了事务的?法,相互调?时,事务是如何在这些?法间进?传递的

事务隔离级别是保证多个并发事务执?的可控性的(稳定性的),?事务传播机制是保证?个事务在多个调??法间的可控性的(稳定性的)


?样,它有不同的隔离?式(酒店隔离还是居家隔离),是为了保证疫情可控,然?在每个?的隔离过程中,会有很多个执?的环节,
?如酒店隔离,需要负责?员运送、物品运送、消杀原?活区域、定时核算检查和定时送餐等很多环节,
?事务传播机制就是保证?个事务在传递过程中是可靠性的,回到本身案例中就是保证每个?在隔离的过程中可控的

?事务传播机制解决的是?个事务在多个节点(?法)中传递的问题,如下图所示:




🍒2.2 事务传播机制种类(7 种)


  1. Spring 事务传播机制包含以下 7 种:
  2. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建?个新的事务
  3. Propagation.SUPPORTS:如果当前存在事务,则加?该事务;如果当前没有事务,则以?事务的?式继续运?
  4. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加?该事务;如果当前没有事务,则抛出异常
  5. Propagation.REQUIRES_NEW:表示创建?个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部?法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部?法会新开启??的事务,且开启的事务相互独?,互不?扰
  6. Propagation.NOT_SUPPORTED:以?事务?式运?,如果当前存在事务,则把当前事务挂起
  7. Propagation.NEVER:以?事务?式运?,如果当前存在事务,则抛出异常
  8. Propagation.NESTED:如果当前存在事务,则创建?个事务作为当前事务的嵌套事务来运?;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED


以上 7 种传播?为,可以根据是否?持当前事务分为以下 3 类:



27607066fd834670b3b9f2f1d808c925.png


以情侣关系以房子为例来举例:


17d9c675b40543658f327cd9926f65e8.png


🍒2.3 Spring 事务传播机制使用


以下代码实现中,先开启事务先成功插??条?户数据,然后再执??志报错,?在?志报错是发?了异常,观察 propagation = Propagation.REQUIRED 的执?结果\


@RestController
public class UserController {
    @Resource
    private UserService userService;
    
    @Transactional(propagation = Propagation.REQUIRED)
    @RequestMapping("/add3")
   if (userInfo == null  || !StringUtils.hasLength(userInfo.getUsername()) || !StringUtils.hasLength(userInfo.getPassword()))return 0;
        int userResult = userService.add(userInfo);
        System.out.println("添加用户:" + userResult);
        LogInfo logInfo = new LogInfo();
        logInfo.setName("添加用户");
        logInfo.setDesc("添加用户结果" + userResult);
        int logResult = logService.add(logInfo);
        return userResult;
 }

REQUIRED:?Transactional(propagation = Propagation.REQUIRED

加入当前事务: Transactional(propagation = Propagation.REQUIRED)

方法调用流程: controller/add -〉用户添加方法->〉日志添加方法

当日志添加方法出现异常之后,加入事务的执行结果是:
1、用户添加成功的数据也回滚了
2、日志添加数据也回滚了

NESTED:?@Transactional(propagation = Propagation.NESTED)

嵌套事务:@Transactional(propagation = Propagation.NESTED)

方法调用流程: controller/add -〉用户添加方法->日志添加方法

当日志添加方法出现异常之后,嵌套事务的执行结果是:
1、用户添加不受影响,添加用户成功了
2、日志添加失败,因为发生异常回滚了事务

嵌套事务(NESTED)和加?事务(REQUIRED )的区别:

● 整个事务如果全部执?成功,?者的结果是?样的

● 如果事务执?到?半失败了,那么加?事务整个事务会全部回滚;?嵌套事务会局部回滚,不会影响上?个?法中执?的结果


🍎三.总结


Spring 事务使?中,重点的内容有 3 个:


  1. 在 Spring 项?中使?事务,?两种?法?动操作和声明式?动提交,其中后者使?的最多,在?法上添加 @Transactional 就可以实现了
  2. 设置事务的隔离级别 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事务隔离级别有 5 种
  3. 设置事务的传播机制 @Transactional(propagation = Propagation.REQUIRED),Spring 中的事务传播级别有 7 种

faf33f68f70840669f42e9da2c91acb3.jpg

版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring 事务失效的六种情况
Spring 事务失效的六种情况
544 0
Spring Boot2.x-10 基于Spring Boot 2.1.2 + Mybatis 2.0.0实现多数据源,支持事务
Spring Boot2.x-10 基于Spring Boot 2.1.2 + Mybatis 2.0.0实现多数据源,支持事务
7352 0
(万字总结)spring事务失效的12种场景, 实在太坑了
为了保障操作的原子性, 避免数据不一样的情况,我们一般都会用到spring事务.但spring事务失效的12种场景, 实在太坑了
35 0
Spring JDBC-实施Spring AOP事务注意事项及案例分析
Spring JDBC-实施Spring AOP事务注意事项及案例分析
34 0
Spring JDBC-事务方法嵌套调用解读
Spring JDBC-事务方法嵌套调用解读
37 0
太难了!面试官让我结合案例讲讲自己对Spring事务传播行为的理解
Spring 在 TransactionDefinition 接口中规定了 7 种类型的事务传播行为。事务传播行为是 Spring 框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是 Spring 为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service 方法事务最好不要嵌套”的传言。要想正确的使用工具首先需要了解工具。本文对七种事务传播行为做详细介绍,内容主要代码示例的方式呈现。
39 0
61 张图,剖析 Spring 事务,就是要钻到底!(4)
61 张图,剖析 Spring 事务,就是要钻到底!
52 0
61 张图,剖析 Spring 事务,就是要钻到底!(3)
61 张图,剖析 Spring 事务,就是要钻到底!
40 0
61 张图,剖析 Spring 事务,就是要钻到底!(2)
61 张图,剖析 Spring 事务,就是要钻到底!
35 0
61 张图,剖析 Spring 事务,就是要钻到底!(1)
61 张图,剖析 Spring 事务,就是要钻到底!
52 0
+关注
游客lvl37ub5rpclk
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和便宜云服务器Docker仓库
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多


http://www.vxiaotou.com