你的位置:首页 > Java教程

[Java教程]深入理解 Spring 事务原理

深入理解 Spring 事务原理 - 落叶的博客 - 博客园

深入理解 Spring 事务原理 一、事务的基本原理Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的足球竞猜。对于...

深入理解 Spring 之 SpringBoot 事务原理 - ignore - CSDN博客

我们就不讨论 ACID 的事务特性,楼主这里假定大家都已经了了解了事务的原理35体育。如果还不了解,可以先去谷歌看看买足球彩票用什么软件好。那么,我们今天的任务是剖析源码,看看Spring 是怎么运行...

深入理解spring事务底层实现原理 - xiaobu201314的博客 - CSDN博客

这就是一个小型的spring事务管理,其实你翻开spring的源码,基本和这个差不多的uedbet体育。只不过是spring中进行了更多的封装欧洲杯直播网站。但是其实有很多时我们不需要的九洲娱乐网。只...

深入理解 Spring 事务原理 - qwergkp

摘要: 一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的爱波网。对于纯JDBC操作数据库,想...

深入理解 Spring 事务原理_Linux编程_Linux公社-Linux系统门户网站

一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的百家乐官网。对于纯JDBC操作数据库,想要用到...

通过源码深入理解 Spring 事务的实现原理

回滚事务 Spring 事务中的设计模式 说明:本场 Chat 将会重点讲解下 Spring 注解事务的实现原理,IoC、AOP 的实现原理不会涉及,如果需要我再另起文章分析,谢谢hg0088皇冠。 ...

深入理解spring的事务管理机制-Java文档类资源-CSDN下载

【免费】深入描述spring的事务处理机制,很不错的资源zhibo 8。更多下载资源、学习资料请访问CSDN下载频道.

深入理解SpringMVC原理及源码解析 - 知乎

深入理解SpringMVC原理及源码解析 温海波 Java高级软件工程师 7人赞同了该文章 MVC是英文Modle View Controller的简称,是一种软件设计典范,目的是将业...

深入理解Spring事务底层原理_6_Java高级架构师课程分享在线听...

深入理解hdfs架构和工作原理 nginx高并发下的安全认话题-让你的敏感数据不再裸奔 SSO单点登录原理与实现 手把手教你玩转hadoop 高并发系统编程实战-让你从容应对电...

深入理解spring生命周期与BeanPostProcessor的实现原理-技术之门...

今天我们就来一起看看spring底层是如何实现这些的,在看它的实现原理之前,我们再来把之前几种方式结合放一个例子中演示下 新建一个User1对象如下: /** * 定义...

深入理解spring架构与原理从设计模式与原则理解Sring视..._新浪博客

深入理解spring架构与原理从设计模式与原则理解Sring视频课程 39套Java架构师,...第二十五套:【微课】基于支付系统场景的微架构的分布式事务...

深入理解Spring事务原理_java_脚本之家

这篇文章主要带领大家深入理解Spring事务原理,Spring事务的传播属性... 这篇文章主要带领大家深入理解Spring事务原理,Spring事务的传播属性一、事务的...

深入了解面向切面编程 Spring底层两种动态代理实现原理及区别

他们使用同一个日志,缓存,事务控制,一个东西解决一类问题,这就是AOP博狗备用。Spring的AOP底层通过动态代理实现,Spring能够为容器中管理的对象生成动态代理对象万博manbetx平台。我们如果使用...

深入理解Spring框架之AOP实现原理 - 云+社区 - 腾讯云

org.springframework.cglib.proxy包下的原生接口,同.sf.cglib.proxy包下的接口,都是源自cglib库新万博体育。Spring内部的cglib动态代理使用了这种方式迅盈比分。 对应...

《深入理解Spring Cloud与微构建》第1章 微简介_码神岛

《深入理解Spring Cloud与微构建》第1章 微简介DDAlex 9 2019-04-04...分布式事务:参考《分布式架构:原理、设计与实战》第二章彻底解决分...

深入理解 Spring Cloud 核心组件与底层原理 – Python量化投资

五、Spring Cloud核心组件:Zuul 六、总结之前一直在看 Spring Cloud 及微架构 对 Spring Cloud 的主要组件的原理有了更深入一点的理解,特地做一下...

《深入理解Spring MVC源代码:从原理分析到实战应用..._中国图书网

《深入理解Spring MVC源代码:从原理分析到实战应用》王耀编著,出版于2019-11-01,中国图书网为您提供正版《深入理解Spring MVC源代码:从原理分析到实战应用》价格、...

理解基于原理深入实战架构Spring

大学教材素材,人民邮电出版社官方旗舰店,微架构实战 基于Spring Boot Spring Cloud Docker 深入理解微原理相关图片uedbet官网app。

深入理解Spring MVC源代码:从原理分析到实战应用 - 读书网|dushu...

作者简介 暂缺《深入理解Spring MVC源代码:从原理分析到实战应用》作者简介图书目录 暂缺《深入理解Spring MVC源代码:从原理分析到实战应用》目录...美国苏梅岛美国旅游5日美国旅游5日美国旅行美国旅行印度金三角旅游签证费用北京出发去塞拉利昂旅游 北京出发去塞拉利昂旅游 北京出发去塞拉利昂旅游 北京出发去塞拉利昂旅游 北京出发去塞拉利昂旅游 北京出发去塞拉利昂旅游 北京出发去塞内加尔旅游 北京出发去塞内加尔旅游 北京出发去塞内加尔旅游 北京出发去塞内加尔旅游 北京出发去塞内加尔旅游 北京出发去塞内加尔旅游 北京出发去塞浦路斯旅游 北京出发去塞浦路斯旅游 北京出发去塞浦路斯旅游 北京出发去塞浦路斯旅游 北京出发去塞浦路斯旅游 北京出发去塞浦路斯旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游 北京出发去塞舌尔旅游

一、事务的基本原理

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的欧洲杯直播网站。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:

  1. 获取连接 Connection con = DriverManager.getConnection()
  2. 开启事务con.setAut mit(true/false);
  3. 执行CRUD
  4. 提交事务/回滚事务 con mit() / con.rollback();
  5. 关闭连接 conn.close();

使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成8波比分。?那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了博狗备用网址。下面简单地介绍下,注解方式为例子

  1. 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识www.zhibo8。
  2. spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)立博备用网址。
  3. 真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的万博亚洲苹果下载。

二、Spring 事务的传播属性

所谓spring事务的传播属性,就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为wellbet黑平台。这些属性在TransactionDefinition中定义,具体常量的解释见下表:

常量名称常量解释
PROPAGATION_REQUIRED支持当前事务,如果当前没有事务,就新建一个事务rankbet。这是最常见的选择,也是 Spring 默认的事务的传播第一足球网。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起钱柜娱乐89168澳门官方。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行探球。
PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常bet皇冠体育网站。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起足球网址。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常扑鱼达人2。
PROPAGATION_NESTED

如果一个活动的事务存在,则运行在一个嵌套的事务中幸运28投注技巧。如果没有活动事务,则按REQUIRED属性执行皇冠体育网站。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点葡京娱乐sobowang.com。内部事务的回滚不会对外部事务造成影响我要高清足球比分。它只对DataSourceTransactionManager事务管理器起效娱乐场游戏。

三、数据库隔离级别

隔离级别隔离级别的值导致的问题
Read-U mitted0导致脏读
Read mitted1避免脏读,允许不可重复读和幻读
Repeatable-Read2避免脏读,不可重复读,允许幻读
Serializable3串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读皇冠体育。执行效率慢,使用时慎重

脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据捕鱼游戏 71966澳门永利。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据天下足球直播吧。

不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的7m足球比分。

幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改hg0088新2网址。

总结:

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大上葡京赌场。

大多数的数据库默认隔离级别为 Read mited,比如 SqlServer、Oracle

少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB

四、Spring中的隔离级别

常量解释
ISOLATION_DEFAULT这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别同创娱乐平台。另外四个与 JDBC 的隔离级别相对应博狗注册。
ISOLATION_READ_U MITTED这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据最新皇冠。这种隔离级别会产生脏读,不可重复读和幻像读皇家娱乐平台。
ISOLATION_READ MITTED保证一个事务修改的数据提交后才能被另外一个事务读取皇冠代理。另外一个事务不能读取该事务未提交的数据吉祥游戏官网。
ISOLATION_REPEATABLE_READ这种事务隔离级别可以防止脏读,不可重复读fun88。但是可能出现幻像读黄金城娱乐(laibofa来博)。
ISOLATION_SERIALIZABLE这是花费最高代价但是最可靠的事务隔离级别macauslot。事务被处理为顺序执行千亿国际娱乐。

五、事务的嵌套

通过上面的理论知识的铺垫,我们大致知道了数据库事务和spring事务的一些属性和特点,接下来我们通过分析一些嵌套事务的场景,来深入理解spring事务传播的机制hg1088.com。

假设外层事务 Service A 的 Method A() 调用 内层Service B 的 Method B()

PROPAGATION_REQUIRED(spring 默认)

如果ServiceB.methodB() 的事务级别定义为 PROPAGATION_REQUIRED,那么执行 ServiceA.methodA() 的时候spring已经起了事务,这时调用 ServiceB.methodB(),ServiceB.methodB() 看到自己已经运行在 ServiceA.methodA() 的事务内部,就不再起新的事务万博体育网站。

假如 ServiceB.methodB() 运行的时候发现自己没有在事务中,他就会为自己分配一个事务新万博体育。

这样,在 ServiceA.methodA() 或者在 ServiceB.methodB() 内的任何地方出现异常,事务都会被回滚日搏。

PROPAGATION_REQUIRES_NEW

比如我们设计 ServiceA.methodA() 的事务级别为 PROPAGATION_REQUIRED,ServiceB.methodB() 的事务级别为 PROPAGATION_REQUIRES_NEWuedbet官网app。

那么当执行到 ServiceB.methodB() 的时候,ServiceA.methodA() 所在的事务就会挂起,ServiceB.methodB() 会起一个新的事务,等待 ServiceB.methodB() 的事务完成以后,它才继续执行明升88。

他与 PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了比分200网。因为 ServiceB.methodB() 是新起一个事务,那么就是存在两个不同的事务28比分。如果 ServiceB.methodB() 已经提交,那么 ServiceA.methodA() 失败回滚,ServiceB.methodB() 是不会回滚的dafabet.com。如果 ServiceB.methodB() 失败回滚,如果他抛出的异常被 ServiceA.methodA() 捕获,ServiceA.methodA() 事务仍然可能提交(主要看B抛出的异常是不是A会回滚的异常)立博备用网址。

PROPAGATION_SUPPORTS

假设ServiceB.methodB() 的事务级别为 PROPAGATION_SUPPORTS,那么当执行到ServiceB.methodB()时,如果发现ServiceA.methodA()已经开启了一个事务,则加入当前的事务,如果发现ServiceA.methodA()没有开启事务,则自己也不开启事务万博亚洲苹果下载。这种时候,内部方法的事务性完全依赖于最外层的事务wellbet黑平台。

PROPAGATION_NESTED

现在的情况就变得比较复杂了, ServiceB.methodB() 的事务属性被配置为 PROPAGATION_NESTED, 此时两者之间又将如何协作呢? ?ServiceB#methodB 如果 rollback, 那么内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint 而外部事务(即 ServiceA#methodA) 可以有以下两种处理方式:

a、捕获异常,执行异常分支逻辑

void methodA() {   try {    ServiceB.methodB();   } catch (SomeException) {    // 执行其他业务, 如 ServiceC.methodC();   }  }

这种方式也是嵌套事务最有价值的地方, 它起到了分支执行的效果, 如果 ServiceB.methodB 失败, 那么执行 ServiceC.methodC(), 而 ServiceB.methodB 已经回滚到它执行之前的 SavePoint, 所以不会产生脏数据(相当于此方法从未执行过), 这种特性可以用在某些特殊的业务中, 而 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 都没有办法做到这一点rankbet。

b、 外部事务回滚/提交 代码不做任何修改, 那么如果内部事务(ServiceB#methodB) rollback, 那么首先 ServiceB.methodB 回滚到它执行之前的 SavePoint(在任何情况下都会如此), 外部事务(即 ServiceA#methodA) 将根据具体的配置决定自己是 mit 还是 rollback

另外三种事务传播属性基本用不到,在此不做分析第一足球网。

六、总结

对于项目中需要使用到事务的地方,我建议开发者还是使用spring的TransactionCallback接口来实现事务,不要盲目使用spring事务注解,如果一定要使用注解,那么一定要对spring事务的传播机制和隔离级别有个详细的了解,否则很可能发生意想不到的效果钱柜娱乐89168澳门官方。