事务回滚

深入理解Spring事务的那点事

亡梦爱人 提交于 2020-02-14 11:35:40
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真正的数据库层的事务提交和回滚是通过binlog或者redo

20180928 SQL SERVER 事务回滚

被刻印的时光 ゝ 提交于 2020-02-09 15:21:21
begin tran:设置起点 commit tran:使事务成为数据库中永久的、不可逆转的一部分 rollback tran:本质上说想要忘记它曾经发生过 save tran:创建一个特定标记,只允许部分回滚 begin tran 事务的开始可能是事物过程中最容易理解的概念。它唯一的目的就是表示一个单元的开始。如果由于某种原因,不能或者不想提交事务,那么这就是所有数据库活动将要回滚的起点。也就是说,数据库会忽略这个起点之后的最终没有提交的所有语句。 语法如下: begin tran[saction] [<transaction name>|<@transaction variable>][with mark[<'description'>]] 1 commit tran 事务的提交是一个事务的终点。当发出commit tran命令时,可以认为事务执行完毕。也就是说,事务所包含的所有Sql语句执行完毕,事务的影响现在是持久的并会继续,即使系统发生故障也不受影响(只要有备份或数据库文件没有被物理破坏就行)。撤销已完成事务的唯一方法就是发出一个新的事务,从功能上而言,该事务是对上一个事务的反转。 commit tran语法如下: commit tran[saction][<transaction name>|<@transaction variable>] 1 rollback

mysql事务回滚机制概述

柔情痞子 提交于 2020-02-08 05:11:47
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码; 2 连接数据库,验证密码; 3 验证成功,获得用户信息,比如存款余额等; 4 用户输入需要取款的金额,按下确认键; 5 从后台数据库中减掉用户账户上的对应金额; 6 ATM吐出钱; 7 用户把钱拿走。 对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地 来说,就是取钱这7步要么都完成,要么就啥也不做,在数据库中就是这个道理。 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,在事务中,每个正确的原子 操作都会被顺序执行,直到遇到错误的原子操作。回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行将update之前的记录还原。 因此,正确的原子操作是真正被执行过的,是物理执行。 事务是由一条或者多条sql语句组成,在事务的操作中,要么这些sql语句都执行,要么都不执行。 事务的ACID特性:原子性,一致性,隔离性,持久性。 在当前事务中确实能看到插入的记录,最后只不过被删除了,但是auto_increament不会删除而是改变值

oracle系统表查询

一世执手 提交于 2020-02-07 09:51:18
                    oracle系统表查询 oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等 select * from user_tab_comments -- 查询本用户的表,视图等 select * from all_col_comments --查询所有用户的表的列名和注释. select * from user_col_comments -- 查询本用户的表的列名和注释 select * from all_tab_columns --查询所有用户的表的列名等信息(详细但是没有备注). select * from user_tab_columns --查询本用户的表的列名等信息(详细但是没有备注). --一般使用1: select t.table_name,t.comments from user_tab_comments t --一般使用2: select r1, r2, r3, r5 from (select a.table_name r1, a.column_name r2, a.comments r3 from user_col_comments a), (select t.table_name r4, t.comments r5 from user_tab

Spring事务

我是研究僧i 提交于 2020-02-07 01:47:59
事务管理 是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性; Spring 实现事务管理有如下两种方式: 编程式事务管理:   将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式管理事务中,必须在每个事务操作中包含额外的事务管理代码。 声明式事务管理(推荐):    大多数情况下比编程式事务管理更好用,它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理, Spring声明式事务管理建立在 AOP基础之上,是一个典型的横切关注点,通过环绕增强来实现,其原理是对方法前后进行拦截,然后在目标方法开始之前创建或加入一个事务,在执行完毕之后根据执行情况提交或回滚事务,其模型如下: public Object around(ProceedingJoinPoint joinPoint) throws Throwable { try { //开启事务 returnjoinPoint.proceed(); //提交事务 } catch (Throwable e) { //回滚事务 throwe; }finally { //释放资源 } } 如何实现声明式事务: 1、添加 spring-aspects-4.3.10.RELEASE.jar包 2、在 Spring配置文件中添加如下配置: <!-- 配置事务管理器 --> <bean id=

Transactional详细信息

孤者浪人 提交于 2020-02-03 21:21:50
Transactional能入的值 isolation:事务的隔离级别 propagation:事务的传播行为 noRollbackFor:哪些异常事务可以不回滚(输入类型) noRollbackForClassName:哪些异常事务可以不回滚(输入全类名) rollbackFor:哪些异常事务需要回滚(输入类型) rollbackForClassName:哪些异常事务需要回滚(输入全类名) readOnly:设置事务只读 (默认为false)这个属性只能够使用在查询sql中。 timeout:事务超出指定时间后进行回滚(以秒为单位) 此文章就展示项目架构了项目架构请看 此文章 案例 timeout 案例 错误提示 readOnly 案例 错误提示 PreparedStatementCallback; SQL [update balance set price = price - ? where name= ?]; Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification

JDBC--控制事务

廉价感情. 提交于 2020-02-03 18:04:47
事务 概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 操作: 1,开启事务:start transaction; 2,回滚:rollback; 3,提交:commit; 使用Connection对象管理事务 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务 在执行sql之前开启事务 提交事务:commit 当所有sql都执行完提交事务 回滚事务:rollback() 在catch中回滚事务 来源: CSDN 作者: Boml.白顶 链接: https://blog.csdn.net/qq_43616001/article/details/104157596

spring @Transactional注解参数详解(13)

非 Y 不嫁゛ 提交于 2020-02-02 04:31:57
事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean implements TestService {} 当类中某些方法不需要事物时: 1 @Transactional 2 public class TestServiceBean implements TestService { 3 private TestDao dao; 4 public void setDao(TestDao dao) { 5 this.dao = dao; 6 } 7 @Transactional(propagation =Propagation.NOT_SUPPORTED) 8 public List getAll() { 9 return null; 10 } 11 } 事物传播行为介绍:   @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)   @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务   @Transactional(propagation

oracle redo undo

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-01 03:11:35
redo--> undo-->datafile insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据. redo解释: 在Oracle数据库中,执行数据修改操作后, 并不是马上写入数据文件,而是首先生成重做信息 ,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。 UNDO: undo->记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据 redo->记录所有操作, 用于恢复 (redo records all the database transaction used for recovery) undo->记录所有的前印象, 用于回滚 (undo is used to store uncommited data infor used for rollback) redo->已递交的事务,实例恢复时要写到数据文件去的 undo->未递交的事务. redo的原因是

@Transactional事务注解简单说明

家住魔仙堡 提交于 2020-02-01 02:42:47
使用位置 : @Transactional事务注解 既可以写在方法上也可以写在类上 @Transactional( rollbackFor = Exception.class ) 使用: 1.默认值为UncheckedException,包括了RuntimeException和Error. 2.当我们直接使用 @Transactional 不指定 rollbackFor 时,Exception及其子类都不会触发回滚 详情细节参考大佬 : https://zhuanlan.zhihu.com/p/38208248 https://www.cnblogs.com/clwydjgs/p/9317849.html 下面情况会回滚: 1.如果没有加@Transactional注解,那么这两个操作就不在一个事务里面,不具有原子性。如果deleteAll之后抛异常,那么就会导致只删除不新增。 2.加了@Transactional之后,这两个动作在一个事务里头,具有原子性,要么全部成功,要么全部失败。如果deleteAll之后抛异常,则事务回滚,恢复原先被删除的数据。 @Transactional public void deleteAllAndAddOneTransactional(Customer customer) { customerRepository.deleteAll(); if (