Spring事务那些事儿

(一)事务的隔离级别

  • 大家都知道事务有四个属性,即ACID(原子性、一致性、隔离性、持久性)。这四个里面稍微难理解点的是一致性和持久性。所谓的一致性是指:事务执行前后数据的一致性状态,例如事务执行前用户有1万元,事务回滚后用户仍应该有1万元。而这里的持久性指的是:事务在提交后结果是永久的,即使程序崩溃数据也能恢复,当然数据库的持久性指的是高可靠性,事务执行后数据保证一定写到了磁盘及备份日志,但并不是指高可用性 ,如果你强行把机器的磁盘烧了,那数据也是无法恢复的。
  • 在事务隔离性的基础上,我们对事务间的相互影响程度进行定级,即事务的隔离级别。通常事务有四种隔离级别:read uncommitted、read committed、repeatable read、serializable。
    (1)read uncommitted是最低的隔离级别,其实就如其英文名一样,处于这个级别的事务可能会读到其他事务尚未提交的数据修改,即存在脏读问题。除此之外,还存在不可重复读和幻读问题问题。
    (2)read committed是大部分数据库的默认隔离级别,它解决了脏读问题,但是仍存在不可重复读和幻读问题。
    (3)repeatable read解决了不可重复读的问题,但是仍可能存在幻读的问题。值得一提的是mysql的默认级别是repeatable read,但它却不存在幻读问题,因为mysql通过使用next-key lock技术解决了问题,即使在repeatable read级别也能完全保证事务的隔离性要求。
    (4) serializable是最为严格的隔离级别,所有事务顺序执行,实际上是通过将并行转为串行来解决事务隔离问题,无疑会降低性能。

不可重复读和幻读的区别:
不可重复读指在同一事务中多次查询同一记录(eg:select * from xx where id = 1),查询结果不一致。这主要是由于多次读期间其他事务update或delete了记录。
幻读是指在同一事务中多次进行范围查询(eg:select count(*) from xx where id > 1 and id < 100),查询结果不一致。这主要是由于多次范围查询期间其他事务insert了新数据。

(二)事务的参与者及分类

在一般的事务场景中通常有以下几个参与者:

  1. RM:用于管理系统数据资源,即通常意义上的数据库服务器等。
  2. TP monitor:主要用于分布式事务,用来协调处理多个RM的事务处理。
  3. TM:事务的管理者,负责事务界定、事务上下文传播等功能。
  4. Applacation:运行于容器中的应用程序,例如spring应用程序。

我们通常会根据RM的数量将事务分为分布式事务和局部事务(本地事务)两种。 在分布式事务中通常会存在多个不同的RM,这些RM分布在不同的系统中,相互之间通过TP monitor协调,利用两阶段提交来保障事务的ACID属性。在局部事务中一般每次数据操作只有一个RM,数据操作只需操作一个数据库,在同一个事务中不会进行多个数据库的更新。接下来我们将着重介绍局部事务的实现,毕竟分布式事务我懂的也不多😜。

(三)局部事务详解

1.事务原理简介

首先我们需要了解的很重要的一点是,spring的事务底层实现本质上是依赖于其使用的数据库服务器,例如mysql数据库。在mysql数据库中事务的隔离依赖于mysql的锁机制,持久性和原子依赖于redo日志,而一致性依赖于undo日志。mysql提供事务功能的具体实现,spring负责界定事务的边界及定义事务的传播性,然后通过特定的数据访问技术(例:jdbc、hibernate等)的API对事务进行管理。
我们以jdbc举个简单的例子,我们可以看下面的代码:

        Connection connection = null;boolean rollback = false;try {connection = dataSource.getConnection();connection.setAutoCommit(false);// 数访问XXXXXXXXXXXX;connection.commit();} catch (SqlException e) {rollback = true;} finally {if (rollback) {connection.rollback();} else {connection.close();}}

这就是我们利用jdbc进行的最简单的事务管理,将autoCommit置为false,然后根据各种情况进行事务的回滚提交等操作。而我们平时普通的数据操作都是默认自动提交,mysql会自动隐式的帮我们commit事务。
但是上面的写法在实际的开发中存在很多的问题:1.不同的数数据访问技术有不同的api、2.我们需要自己手动捕获处理各种以sql异常、3.事务管理代码和数据访问代码及业务代码耦合在一起。

2.spring事务框架重要类

为了解决上面提到的问题,spring为我们提供了优秀的事务框架。我们先来介绍下事务框架中重要的类:

顶层接口职责
TransactionDefinition用来定义事务属性,包括事务的隔离性、传播性、超时时间、是否只读等属性。
TransactionStatus用来记录事务开启到事务结束期间事务的状态,这个类一般在编程式事务中使用。
PlatformTransactionManagerspring事务框架的核心类,负责事务的管理,包括事务的commit、rollback等。
3.spring事务传播性
事务传播性说明
REQUIRED业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务,这是spring默认的传播行为。
SUPPORTS如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。
MANDATORY只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常。
REQUIRES_NEW业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行。
NOT_SUPPORTED声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
NEVER声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常。只有没关联到事务,才正常执行。
NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动的事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保证点。内部事务回滚不会对外部事务造成影响, 它只对DataSourceTransactionManager 事务管理器起效。

--------未完待续,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silverlight Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)

Silverlight & Blend动画设计系列八&#xff1a;拖放(Drag-Drop)操作与拖放行为(DragBehavior) 原文:Silverlight & Blend动画设计系列八&#xff1a;拖放(Drag-Drop)操作与拖放行为(DragBehavior)在Silverlight中自身并没有提供拖放功能的相关实现&#xff0c;要实现拖…

mysql查询显示行号

见&#xff1a;http://blog.csdn.net/muzizhuben/article/details/49449853 使用mysql查询显示行号&#xff0c;没有像oracle这么方便。 不过也可以通过设定变量显示行号&#xff0c;例如&#xff1a; -- 生成 行号 select r:r1 as rowno , a.* from my_tb a ,(select r:0) b …

scanf 用法大全

关于标准库函数scanf论坛上很多人对scanf的不太了解&#xff0c;导致程序出错&#xff0c;我想把scanf的具体用法贴出来&#xff0c;希望大家可以共同进步&#xff0c;有什么不对的地方可以提出来。int scanf(char *format&#xff0c;...);这应该是scanf的标准形式。先说说关于…

深入了解Spring IoC

IoC全称Inversion of Control即控制反转&#xff0c;它还有一个别名依赖注入。spring利用Ioc容器帮我们自动构建对象及注入依赖对象&#xff0c;减少了对象构建与业务代码的耦合&#xff0c;使得我们能够更加高效愉快的写bug&#x1f41e;了(&#xffe3;▽&#xffe3;)"…

软文营销实战记录

最近拜读了徐茂权老师的《 网络营销决胜武器(第2版)》&#xff0c;下面会梳理书中的内容&#xff0c;记录下以后可能会用到的软文营销的技巧。 一、软文载体 1、平面媒体软文&#xff1a;报纸、期刊。 2、非正式出版的基于印刷、打印形式载体的软文&#xff1a;企业印刷的宣传册…

oracle中rownum和row_number()的区别

见&#xff1a;http://www.jb51.net/article/65960.htm row_number()over(partition by col1 order by col2)表示根据col1分组&#xff0c;在分组内部根据col2排序&#xff0c;而此函数计算的值就表示每组内部排序后的顺序编号&#xff08;组内连续的唯一的&#xff09;。 与ro…

java类加载顺序

在java中类的加载、初始化都是在程序运行期完成的&#xff0c;虽然会稍微增加开销&#xff0c;但是却很大的增加了灵活性&#xff0c;我们可用在运行期间动态的去网络或其他地方加载一个二进制流来作为程序代码的一部分。接下来我们简单介绍下java类加载过程。 从上图中我们可…

dealloc不调用的情况

2019独角兽企业重金招聘Python工程师标准>>> 1、没有停止定时器 - (void)dealloc { [_timer invalidate]; _timer nil; } 2、VC中有代理Delegate&#xff0c;需要设置delegate的时候&#xff0c;设置为weak property (nonatomic,weak) id<ZoeEatDe…

day10-列表生成式

列表生成式即List Comprehensions&#xff0c;是Python内置的非常简单却强大的可以用来创建list的生成式。 1、生成一个列表 a [i for i in range(1,100) if i%21]print(list(a))或print(a)[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, …

jrebel、JavaRebel

见&#xff1a;https://baike.baidu.com/item/jrebel/1115725?fraladdin JRebel是一套JavaEE开发工具。中文名jrebel属 性JavaEE开发工具资 费收费软件作 用Jrebel 可快速实现热部署JRebel是一套JavaEE开发工具。JRebel允许开发团队在有限的时间内完成更多的任务修正…

自己写函数库

大家现在写 程序&#xff0c;是不是都是用新唐提供的函数库&#xff1f;在体验 开发板的一开始&#xff0c;我也是使用函数库&#xff0c;毕竟这个太方便了。可是有一天&#xff0c;我发现一个只使用时钟和IO以及 调试 串口的程序居然查过了16k的时候&#xff0c;我震惊了&…

[MicroPython]stm32f407控制DS18B20检测温度

2019独角兽企业重金招聘Python工程师标准>>> 1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法。 2. 进一步学习编制数据输出程序的设计方法。 3. 学习DS18B20的接线方法&#xff0c;并利用DS18B20检测当前温度。 2.所需元器件 F407Micropython开发板…

带你理解Spring AOP

AOP概述 在我们的日常开发中&#xff0c;除了正常业务逻辑外&#xff0c;还可能经常会需要在业务逻辑的特定位置加入日志&#xff0c;以便于调试和问题分析。但是这种插入日志的逻辑和业务逻辑间并不存在连续性和依赖性&#xff0c;这种逻辑侵入随着项目的不断发展&#xff0c…

10.20随笔

ES6 ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言。 这种语言在万维网上应用广泛&#xff0c;它往往被称为JavaScript或JScript&#xff0c;但…

极客招募令!兄弟杯区块链极客竞技大赛在上海等您来战!

据悉&#xff0c;由国内首家区块链技术社区区块链兄弟主办&#xff0c;旺链科技、离子链、中国云体系产业创新战略联盟、无退社区、指旺金科等单位强力支持&#xff0c;HiBlock区块链社区、火球财经、布洛克财经、海豚区块链、区块网等百家技术社区和媒体通力合作的兄弟杯区块链…

Java中Web程序修改配置文件不重启服务器的方法

见&#xff1a;http://blog.sina.com.cn/s/blog_69398ed9010191jg.html 另&#xff1a;http://ekisstherain.iteye.com/blog/1701463 jrebel 、JavaRebel是什么&#xff0c;见另一博客&#xff1a;jrebel/JavaRebel 开发环境 1. JDK 2. MyEclipse 3. Tomcat 4. Struts2 5.…

ffmpeg-0.6.3 移植到 windows 开源代码

ffmpeg-0.6.3开源编码解码库&#xff0c;从linux下移植到windows vs2005&#xff0c;全部开源。 需要 Intel C Compile 和 开源的SDL库支持&#xff0c;由于 Intel C Compile支持C99语法&#xff0c;所以源代码改动很小很小。 主要的修改 1&#xff1a;添加了linux中有而wind…

一起唠唠分布式锁

&#xff08;1&#xff09;分布式锁和分布式事务的区别 1.分布式锁是在集群环境下&#xff0c;用来控制不同机器对全局共享资源的访问。 2.分布式事务是在集群环境下&#xff0c;用来保证全局事务的一致性&#xff0c;保证多个数据库的数据整体上能正确的从一个一致性状态转到…

luogu2577/bzoj1899 午餐 (贪心+dp)

首先&#xff0c;应该尽量让吃饭慢的排在前面&#xff0c;先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人&#xff0c;然后1号窗口目前的总排队时间是j&#xff0c;目前的最大总时间 有这个i和j的话&#xff0c;再预处理出前i个人的排队总时间sum[i]&a…

wpf中xps文档合并功能实现

原文:wpf中xps文档合并功能实现跟着上一篇的xps文档套打的文章&#xff0c;近期一直在研究xps打印技术&#xff0c;其中用户提到了一个需求&#xff0c;要求能够多页面进行打印&#xff0c;我的想法是&#xff0c;先生成xps文件&#xff0c;然后将文件读取出来以后&#xff0c;…