Spring实战(十三)Spring事务

  1、什么是事务(Transaction)?

       事务是指逻辑上的一组操作,要么全部成功,要么全部失败。

  事务是指将一系列数据操作捆绑成为一个整体进行统一管理。如果某一事务执行成功,则该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误必须取消或者回滚,则数据将全部恢复到操作前的状态,所有的数据的更改均被消除。

  

  2.事务的特性

  原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  一致性:事务前后的数据的完整性必须保持一致。

  隔离性:多个用户并发访问数据库,一个用户的事务的执行不能被其他事务干扰,多个并发事务之间的数据要相互隔离。

  持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,即使数据库发生故障也不应该有任何影响。

  

  3.事务并发操作带来哪些问题?

     丢失修改:两个事务T1和T2读入同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

  脏读:一个事务读取了另一个事务改写但还未提交的数据,若这些事务被回滚,这个读取就是无效的。

  不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同(读时数据发生了改变)。

  幻读:一个事务读取了几行记录后,另一个事务插入一些记录,发生幻读。后来的查询中,第一个事务发现一些原来没有的记录。

 

  4、Spring事务管理API(主要有3个)

  PlatformTransactionManager:事务管理器;

  TransactionDefinition:事务的定义信息(隔离,传播,超时,只读);

  TransactionStatus:保存事务具体运作状态

 

  5、PlatformTransactionManager 事务管理器

  spring为不同的持久化框架提供了不同的PlatformTransactionManager。

  不论 采用何种方式,都必须先创建“事务管理器”的对象。

 

  6、TransactionDefinition 定义事务(隔离,传播,超时,只读)

  设置隔离级别:(一组常量定义)

   

  (mysql 默认REPEATABLE_READ、oracle默认 READ_COMMITTED)

 

  定义事务的传播行为

  应用场景:当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个完整的业务操作,因此就会产生服务接口方法嵌套调用的情况, Spring通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中。

  Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

  (当使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC 3.0,并且实现者需要支持保存点事务机制。)

事务传播行为类型

                        
                        

说明

                        
                        

PROPAGATION_REQUIRED

                        
                        

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

                        
                        

PROPAGATION_SUPPORTS

                        
                        

支持当前事务,如果当前没有事务,就以非事务方式执行。

                        
                        

PROPAGATION_MANDATORY

                        
                        

使用当前的事务,如果当前没有事务,就抛出异常。

                        
                        

PROPAGATION_REQUIRES_NEW

                        
                        

新建事务,如果当前存在事务,把当前事务挂起。

                        
                        

PROPAGATION_NOT_SUPPORTED

                        
                        

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

                        
                        

PROPAGATION_NEVER

                        
                        

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

                        
                        

PROPAGATION_NESTED

                        
                        

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

                        

  此外,还有超时时间、是否只读等相关功能。

 

 

  7、TransactionStatus:保存事务状态

  接口提供了一些方法来判断(获得)事务当前的状态:  

  void flush();冲洗数据库底层会话

  boolean hasSavePoint();返回该事务是否有一个保存点

  boolean isCompleted();返回事务是否提交或者回滚

  boolean isNewTransaction();返回是否是一个新事务

  boolean isRollbackOnly();判断这个事务是否已经设置了rollback-only。

  void setRollbackOnly();设置这个事务rollback-only。

 

  8、嵌套事务

  嵌套是子事务套在父事务中执行,子事务是父事务的一部分。

  在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务。这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point,看几个问题就明白了。

  如果子事务回滚,会发生什么?
  父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。

  如果父事务回滚,会发生什么?
  父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。

  那么:事务的提交,是什么情况? 是父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?
  答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。

 

  9、Spring支持两种方式事务管理

  ——编程式的事务管理

    • 实际开发中很少应用
    • 通过TransactionTemplate手动管理事 

  ——使用XML配置声明事务

    • 开发中推荐使用(代码侵入性最小)
    • Spring的声明式事务是通过AOP实现

 

  10、声明式事务管理——XML配置(AOP思想)

  step-01  配置事务管理器——注入dataSource,确定对哪个数据库操作;

  step-02  配置事务的增强——要做的事务操作,确定进行事务操作的方法匹配规则。(隔离级别、哪个方法进行事务)

  step-03  配置切面——把通知应用到切点。

 

  11、声明式事务管理——注解配置

  step-01  配置事务管理器——注入dataSource,确定对哪个数据库操作;

  step-02  开启事务注解;

  step-03  在要使用事务的方法所在类上面添加注解@Transactional。

 

  参考:http://opiece.me/2016/03/18/spring-transactional-introduce/

  

 

转载于:https://www.cnblogs.com/bigbigbigo/p/8383272.html

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

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

相关文章

解密SVM系列(二):SVM的理论基础(转载)

解密SVM系列(二):SVM的理论基础 原文博主讲解地太好了 收藏下 解密SVM系列(三):SMO算法原理与实战求解 支持向量机通俗导论(理解SVM的三层境界) 上节我们探讨了关于拉格朗日乘子…

cout输出数组_让程序从1开始一直执行++操作,10秒钟能输出最大的数是多少

问题描述如果写一段代码,让程序从 1 开始一直执行 操作,在规定的 10s 钟内,你能输出的最大数是多少?并将它打印到屏幕上。乍一看,你会觉得它是一道算法题,再细想:不对!这可能是一道…

微信公众号管理

微信公众号图文编辑 在新建图文时,如果有想插入的视频,可以采取获取视频链接再导入的方法,这样会更高效美观。 摘要和多个图文信息的重叠 新建图文信息,在设置封面旁边有图文摘要,图文摘要会在发送出去的界面旁边有显…

页面模板

找了半天的公众号模板,有点坑,微信公众号更新太快了,几个月不看都找不到使用功能了。 页面模板位置 页面模板在现在的话题专辑,如图: 在页面排版中可以实现我一直想要的菜单整理化功能 可以将文章整理后,发布在菜单…

SQL语句输出

select ,print均可以做输出 但如果想用print同时输出字符串和数字时,就需要遇到转换函数convert: declare allstudents int e.g.print’毕业人数为’convert(char,allstudents) 在执行时可能会遇到结果中显示了你的输出信息,而在消息中却没有&#xff0…

.NET面试题解析(04)-类型、方法与继承

转自:http://www.cnblogs.com/anding/p/5248973.html 常见面试题目: 1. 所有类型都继承System.Object吗? 2. 解释virtual、sealed、override和abstract的区别 3. 接口和类有什么异同? 4. 抽象类和接口有什么区别?使用时有什么需要注意的吗&a…

初学python的format之美

初学python的format之美 *区别于C语言的输出语句的是python的输出用的是"print"而不是“printf”。 1.简单的字符串和变量一起输出 python中的替代使用的是“{}” nameinput("请输入一个人的名字") countryinput("请输入一个国家的名字") prin…

20.链式队列

运行截图: 完整代码: 1 #include <stdio.h>2 #include <stdlib.h>3 4 #define datatype int5 6 typedef struct queue7 {8 datatype data;9 struct queue *pNext; 10 }Queue,*PQueue; 11 12 //入队 从尾部入,从头部出 13 PQueue enq(PQueue phead, dataty…

1到n阶乘算法的改进

1到n阶乘算法的改进 之前用到过好几次了&#xff0c;但总是很长时间不用就会忘了&#xff0c;所以这次直接把它扔进来了。 之前总是喜欢用双层循环&#xff0c;其实一个单层循环足以&#xff0c;下面将用Python和C两种语言进行展示 C&#xff1a; #include<iostream> …

lua 调用文件中的函数调用_深入Lua:调用相关的指令

前言这一节我们来深入解析与调用相关的指令&#xff0c;这些指令是&#xff1a;OP_CALL 调用OP_TAILCALL 尾调用OP_VARARG 可变参数OP_RETURN 返回解析这些指令的过程中&#xff0c;最重要的是时刻跟踪栈的变化情况。简单调用OP_CALL 的语法是&#xff1a;R(A), ... ,R(AC-2) :…

算法基础——列表查找

whats the 算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输…

Python画板画图之美

Python画板画图之美 *turtle.done() #可让画板窗口停止*1.绘制同切圆 pensize为画笔宽度 circle(n),n为半径大小&#xff0c;两者单位均为像素 import turtle turtle.pensize(2) #画笔宽度&#xff0c;单位为像素 turtle.circle(10) #圆半径&…

python request库_【Python爬虫】Request库入门

什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还…

world文档粘贴图片进去看不到

在大学做实验报告的时候经常要插入一些截图&#xff0c;往往会遇到直接复制粘贴图片会看不到的情况&#xff0c;会很烦&#xff0c;我自己也找了好多方法&#xff0c;下面是我最喜欢的简便方法的一种。 解决方法如下: 可以点击鼠标右键选择段落&#xff0c;将行距修改为1.5倍即…

c盘users的用户名怎么改_怎么修改iPhone备份文件夹路径 iPhone C盘路径修改教程【详解】...

iPhone备份文件夹路径怎么修改_iPhone C盘备份路径修改教程 我们都知道iPhone默认的备份是在C盘&#xff0c;不过现在各种视频、照片体积那么大&#xff0c;小小的C盘只怕是负荷不了了&#xff0c;那么有什么办法去修改备份路径呢&#xff0c;下面小编就为大家介绍一下。需要注…

javaweb开发的准备工作——配置篇

1.配置 a. jdk配置&#xff08;用于web开发编程&#xff0c;此处不需要配置path&#xff0c;只需配置环境变量即可&#xff09; b. tomcat配置 打开Tomcat&#xff08;打开bin目录下的startup.bat文件&#xff09; 检验是否打开成功(两个网址都可以&#xff0c;出现汤姆猫即为…

阅读引擎开源项目调研总结

农历腊月初二&#xff0c;也是冬至后的第四个九天&#xff0c;俗称“四九”。冬至这一天开始数九&#xff0c;这就是人们所说的“提冬数九”。数上9天是一九&#xff0c;再数9天是二九……数到“九九”就算“九”尽了&#xff0c;“九尽杨花开”&#xff0c;那时天就暖了。《九…

ftp 上传文件夹_命令行连接FTP服务器

Windows下&#xff1a;打开命令行窗口&#xff0c;输入 ftp&#xff0c;进入ftp命令模式&#xff1a;输入 open ip地址 端口&#xff0c;进入ftp服务器&#xff0c;如open 172.16.3.77 2121。如下图&#xff1a;输入Windows下的用户名&#xff0c;然后输入密码&#xff08;注意…

创建实现一个简单的web项目

创建一个新的web项目 注意要选择Dynamic Web Project&#xff0c;第一次用可能要找一下&#xff0c;也可以直接搜索栏搜web&#xff0c;就会出来 图片是我自己照片照的&#xff0c;不好截图&#xff0c;看到有个人影勿慌哈哈哈哈&#xff0c;不是你眼睛的问题。 然后在web文件目…

eclipse xml文件报错_Maven教程6: Maven与Eclipse整合

点击上方“Java技术前线”&#xff0c;选择“置顶或者星标”与你一起成长一、安装Maven插件下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin进入到eclipse中的dropins目录下&#xff0c;新建三个txt文…