事务回滚

Spring事务详细解释

六月ゝ 毕业季﹏ 提交于 2019-12-03 04:37:20
前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service方法事务最好不要嵌套”的传言。要想正确的使用工具首先需要了解工具。本文对七种事务传播行为做详细介绍,内容主要代码示例的方式呈现。 基础概念 1. 什么是事务传播行为? 事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。 用伪代码说明: public void methodA(){ methodB(); //doSomething } @Transaction(Propagation=XXX) public void methodB(){ //doSomething } 代码中 methodA() 方法嵌套调用了 methodB() 方法, methodB() 的事务传播行为由 @Transaction(Propagation=XXX) 设置决定。这里需要注意的是 methodA() 并没有开启事务,某一个事务传播行为修饰的方法并不是必须要在开启事务的外围方法中调用。 2. Spring中七种事务传播行为 定义非常简单

分布式事务解决方案及实现

爷,独闯天下 提交于 2019-12-03 01:17:19
一、事务的ACID原则   数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID。 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。 持久性:当事务正确完成后,它对于数据的改变是永久性的。 二、什么是分布式事务   事务在单系统中的表现:多次数据库操作用事务进行管理,来保证ACID原则。            但是如果各个模块都是单独独立出来的微服务,进行了分布式部署,单系统里的事务将不能保证各个数据库操作的一致性,因此就需要分布式事务来进行统一管理。          三、分布式事务实现方案   现在的分布式事务实现方案有多种,有些已经被淘汰,如基于XA的两段式提交、TCC解决方案,还有本地消息表、MQ事务消息,还有一些开源的事务中间件,如LCN、GTS。   1

Spring事务管理之回滚异常rollback-for

匿名 (未验证) 提交于 2019-12-03 00:37:01
一、业务背景 业务需求:服务层调用多个dao方法,要求 只要有一条数据库执行语句出错,则全部回滚 。而实际情况是前面四条执行成功,第五条失败,结果只是抛出异常提示,前面四条还是成功执行。 二、出错原因 异常分为checked Exception 捕获异常 跟 unchecked Exception 未捕获异常,Spring 默认发生未捕获异常时自动回滚 ,如发生RuntimeException。项目中都有针对调用dao层方法做try-catch处理,即已经对异常做出捕获处理,不满足Spring默认自动回滚情况,所以才会出现上面所述情况。 三、解决方案(两种) 如果想要不管有没有捕获异常做处理,只要其中一条发生异常,则全部回滚,那么可以采用下面两种配置方法: 1、xml文件中进行显示配置 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 增加事务回滚切面扫描配置,不加的话有捕获异常就不回滚 --> <aop:config> <aop:pointcut id="serviceOperation"

Spring嵌套事务

匿名 (未验证) 提交于 2019-12-03 00:37:01
Spring 事务传播属性如下 PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。    PROPAGATION_SUPPORTS-- 支持当前事务,如果当前没有事务,就以非事务方式执行。    PROPAGATION_MANDATORY-- 支持当前事务,如果当前没有事务,就抛出异常。    PROPAGATION_REQUIRES_NEW-- 新建事务,如果当前存在事务,把当前事务挂起。    PROPAGATION_NOT_SUPPORTED-- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER-- 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED-- 拿以下代码分析Spring 嵌套事务 ServiceA { void methodA() { ServiceB.methodB(); } } ServiceB { void methodB() { } } 案例1,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 如果出现异常, ServiceA.methodA和 ServiceB.methodB 作为一个整体都将一起回滚。 ServiceB.methodB就会为自己分配一个事务

事务在执行过程中报错的处理方式

匿名 (未验证) 提交于 2019-12-03 00:18:01
1.系统在默认情况下: BEGIN TRAN; INSERT INTO dbo.Material_PO_PipeMaterialOrder ( ID , OrderNO , OrderName , Status , RMDSC ) VALUES ( NEWID() , N'测试自动回滚' , N'测试自动回滚' , 9999999999999999999 ,--字段类型是int,但9999999999999999999超过int的最大值,会溢出报错 N'测试自动回滚' ); UPDATE dbo.Material_PO_PipeMaterialOrder SET OrderNO = '测试自动回滚'; COMMIT TRAN; 执行消息: 消息 8115,级别 16,状态 2,第 3 行 将 expression 转换为数据类型 int 时出现算术溢出错误。 语句已终止。 (54 行受影响) 可以看出:Insert语句报错后,系统继续执行后面的Update语句(有行数受影响),没有回滚事务 BEGIN TRAN; INSERT INTO dbo.Material_PO_PipeMaterialOrder ( ID , OrderNO , OrderName , Status , RMDSC ) VALUES ( NEWID() , N'测试自动回滚' , N'测试自动回滚' , ,

事务面试题

匿名 (未验证) 提交于 2019-12-03 00:16:01
事务的特性ACID 事务提供了一种机制,可用来将一系列数据库更改归入一个逻辑操作。更改数据库后,所做的更改可以作为一个单元进行提交或取消。事务可确保遵循原子性、一致性、隔离性和持续性(ACID)这几种属性,以使数据能够正确地提交到数据库中。 1.脏读 一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误的数据,这样就造成了脏读 2.不可重复读 3.幻读 第一个数据正在查询某一条数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻读 不可重复读是指在同一查询事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读 幻读是指在同一查询事务中多次进行,由于其他提交的事务所做的插入操作,每次返回不同的结果集,此时发生幻读表面上看,区别就在于不可重复读能看见其他事务提交的修改和删除,而幻读能看见其他事务提交的插入 1.default:(默认) 默认隔离级别,使用数据库默认的事务隔离级别 2.read_uncommitted:(读未提交) 这是事务最低的隔离级别,他允许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读

C# 事务的创建,提交和回滚

匿名 (未验证) 提交于 2019-12-03 00:03:02
在C#中开启事务的步骤 01.调用SqlConnection对象的BeginTransaction()方法,创建一个SqlTransaction对象,标志事务开始。 02.将创建的SqlTransaction对象分配给要执行的SqlCommand的Transaction属性。 03.调用相应的方法执行SqlCommand命令。 04.调用SqlTransaction的Commit()方法完成事务。或调用Rollback()方法终止事务。 4.在进行事务操作中的注意点 01.在调用BeginTransaction()方法开始事务之前,要打开数据库连接,否则出现异常。 02.如果在事务的Commit()方法或RollBack()方法执行前数据库连接断开或关闭,则事务将回滚。 //准备连接字符串 string str = "data source=.;initial catalog=Myschool;uid=sa;pwd=123" ; //创建数据库连接对象 SqlConnection con = new SqlConnection ( str ); //sql语句:添加一条记录到年级表 string sql = "insert into grade values(@gradename)" ; //创建SqlParameter对象,设置参数 SqlParameter sp = new

No transaction aspect-managed TransactionStatus in scope

匿名 (未验证) 提交于 2019-12-02 23:55:01
No transaction aspect - managed TransactionStatus in scope 出现该异常的原因是因为 在主方法A 中调用了其他模块接口B,然而在B接口 没有声明事务 但是手动回滚了 TransactionAspectSupport . currentTransactionStatus ( ) . setRollbackOnly ( ) ; //回滚 然而在主方法A中却声明了事务,B 接口出错之后 , A方法进行事务回滚是就会出现该异常, 来源:51CTO 作者: weixin_41336805 链接:https://blog.csdn.net/weixin_41336805/article/details/100053095

事务的7种传播特性

匿名 (未验证) 提交于 2019-12-02 23:49:02
Propagation (事务的传播属性) Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 1: PROPAGATION_REQUIRED 加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务 比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候, ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA

spring 事务手动回滚

匿名 (未验证) 提交于 2019-12-02 23:43:01
1、遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: public method() { Dao1.save(Person1); Dao1.save(Person2); Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中 Dao1.save(Person2); } 期待的情况:发生错误之前的 所有数据库保存操作都回滚 ,即不保存 正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。 当遇到这种情况,我们就可以使用Spring的事务解决这个问题。 2、异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 2)Error异常 Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception