mysql事务回滚机制概述
应用场景:
银行取钱,从ATM机取钱,分为以下几个步骤
1 登陆ATM机,输入密码;
2 连接数据库,验证密码;
3 验证成功,获得用户信息,比如存款余额等;
4 用户输入需要取款的金额,按下确认键;
5 从后台数据库中减掉用户账户上的对应金额;
6 ATM吐出钱;
7 用户把钱拿走。
对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地
来说,就是取钱这7步要么都完成,要么就啥也不做,在数据库中就是这个道理。
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,在事务中,每个正确的原子
操作都会被顺序执行,直到遇到错误的原子操作。回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行将update之前的记录还原。
因此,正确的原子操作是真正被执行过的,是物理执行。
事务是由一条或者多条sql语句组成,在事务的操作中,要么这些sql语句都执行,要么都不执行。
事务的ACID特性:原子性,一致性,隔离性,持久性。
在当前事务中确实能看到插入的记录,最后只不过被删除了,但是auto_increament不会删除而是改变值
为什么auto_increament没有回滚:因为innodb存储引擎中的auto_increment就是主键的计数记录的当前值是保存在内存中,并不是存在磁盘中的,当mysql server处于运行的时候,这个计数值只会随着
insert增长,不会随着delete减少。而当mysql server启动的时候,当我们需要查询auto_increment计数值时,mysql便会自动执行:SELECT MIX(ID) FROM 表名 FOR UPDATE;这条语句来获得auto_increment
列的最大值,然后将这个值放到auto_increment计数器中,所以ROLLBACK MYSQL的auto_increment计数器也不会做负运算
事务分为哪些种:扁平事务,带有保存点扁平事务,链事务,嵌套事务,分布式事务。
MYSQL中使用事务:
在MYSQL命令行命令下事务都是自动提交的,即执行Sql语句就会马上执行COMMIT操作。因此要显示一个事务的开启必须使用命令BEGIN或者START TRANSACTION,或者执行命令SET AUTOCOMMIT=0来
禁止当前回话的自动提交
事务控制语句:
BEGIN/START TRANSACTION:显示地开启一个事务
COMMIT:也可以使用COMMIT WORK 两者是等价的。COMMIT会提交事务,并是已对数据库进行的所有的修改是永久性的。
ROLLBACK:也可以使用ROLLBACK WORK,两者也是等价的,回滚会结束用户的事务,并且会撤销正在进行的所有未提交的修改。
SAVEPOINT identifier:允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT
release SAVEPOINT identifier:删除一个事务的保存点,当没有制定的保存点,会抛出一个异常。
SET TRANSACTION:用来设置事务的隔离级别。Innodb存储引擎提供的事务隔离级别有READ UNCOMMITED,READ COMMITED,REPEATABLE READ和SERIALIZABLE.
事务的隔离级别:在数据库操作中,为了保证并发读取数据的正确性,提出了隔离级别,如上
区别如下:
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读 read uncommited 可能 可能 可能
已提交读 read commited 不可能 可能 可能
可重复读 repeatable read 不可能 不可能 可能
可串行化 serializable 不可能 不可能 不可能
脏读:一个事务读取到了另一个事务没有提交的数据
例如:事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取到了T1更新后的行,然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了
不可重复读:在同一事务中,两次读取同一数据,得到的内容不同
例如:事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录。然后T1又再次读取这行记录,发现与刚才读取的结果不同。这就称为“不可重复”读,因为T1原来读取的那行记录已经发生了变化
幻读:在同一事务中,用同样的操作读取两次,得到的记录数不同
例如:事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录,这行记录恰好可以满足T1所使用的查询条件中的WHERE子句的条件。然后T1又使用相同的查询再次对表进行检索,
但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然出现的一样
隔离级别越低,事务请求的琐越少或者说是保持琐的时间越短,Innodb存储引擎默认支持的隔离界别是REPEATALE READ;在这种默认的事务隔离级别下已经能完全保证事务的隔离性。
mysql事务回滚怎样实现的代码可以参考此bolg:http://bbs.csdn.net/topics/390876901
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,
而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。
---------------------
版权声明:本文为CSDN博主「aschulianwuyanzu」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aschulianwuyanzu/article/details/77879727
mysql事务回滚机制概述的更多相关文章
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销. 要同时修改数据库中两个不同表时,如果它们不是一个事 ...
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销.要同时修改数据库中两个不同表时,如果它们不是一个事务 ...
- 为什么mysql事务回滚后, 自增ID依然自增
事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还 ...
- [转] C# mysql 事务回滚
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...
- Spring中的事务回滚机制
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Trans ...
- java方法 throws exception 事务回滚机制
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检 ...
- mysql 事务回滚
begindeclare t_error integer default 0; //添加变量t_error并赋初始值为0declare continue handler for sqlexcepti ...
- Spring 事务回滚机制详解
1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocat ...
- alter table导致的mysql事务回滚失败
今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyI ...
随机推荐
- centos7 install mysql5.7.27
1.yum 安装 wget yum install wget 2.下载MySQL 的yum repo wget https://repo.mysql.com//mysql57-community-re ...
- linux技能点七 shell
shell脚本:定义,连接符,输入输出流,消息重定向,命令的退出状态,申明变量,运算符,控制语句 定义:linux下的多命令操作文件 连接符: ::用于命令的分隔符,命令会从左往右依次执行 & ...
- 《Spring in Action 4》阅读札记
重要思路 Spring通过面向POJO编程.依赖注入.AOP和模板技术来降低Java开发的复杂性. 依赖注入能够让互相协作的软件组件保持松耦合,模块直接的耦合性是必要的,否则没法完成工作,但是耦合性需 ...
- python爬虫系列:三、URLError异常处理
1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常. ...
- liunx 安装nc/netcat centos安装netcat
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 1:下载源码包,wget https://sourceforge.net/projects/n ...
- Java开发环境之MySql
查看更多Java开发环境配置,请点击<Java开发环境配置大全> 叁章:MySql安装教程 1)去官网下载MySql安装包 https://www.mysql.com/downloads/ ...
- Linux命令——od
参考:Linux OD Command Tutorial for Beginners (6 Examples) 简介 查看普通文本文件,可以使用cat.head.tail.tac.less.more等 ...
- Cloudera Certified Associate Administrator案例之Manage篇
Cloudera Certified Associate Administrator案例之Manage篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载Namenode镜像 ...
- C++(四十六) — 异常处理机制、标准IO输入输出
1.异常处理机制 一般来说,异常处理就是在程序运行时对异常进行检测和控制.而在C++ 中,使用 try-throw-catch模式进行异常处理的机制. #include<iostream> ...
- CVE-2019-5475:Nexus2 yum插件RCE漏洞复现
0x00 前言 如果有想一起做漏洞复现的小伙伴,欢迎加入我们,公众号内点击联系作者即可 提示:由于某些原因,公众号内部分工具即将移除,如果有需要的请尽快保存 0x01 漏洞概述 最近hackerone ...