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
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,
而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。
原文链接:https://blog.csdn.net/aschulianwuyanzu/article/details/77879727
提醒自己:
1、如果事务中所有sql语句执行正确则需要自己手动提交commit;否则有任何一条执行错误,需要自己提交一条rollback,这时会回滚所有操作,而不是commit会给你自动判断和回滚。
2、新开一个事务会将该连接中的其他未提交的事务提交,相当于commit!
3、事务既没有提交也没有回滚时连接断开数据库会自动回滚
4、事务中,update语句如果没有commit的话,你再重新执行update语句,就会等待锁定,当等待时间过长的时候,就会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的错误。
mysql事务提交和回滚机制的更多相关文章
- 对mysql事务提交、回滚的错误理解
一.起因 begin或者START TRANSACTION开始一个事务 rollback事务回滚 commit 事务确认 人们对事务的解释如下:事务由作为一个单独单元的一个或多个SQL语句组成,如果其 ...
- MySQL事务提交与回滚
提交 为了演示效果,需要打开两个终端窗口,使用同一个数据库,操作同一张表 step1:连接 终端1:查询商品分类信息 select * from goods_cates; step2:增加数据 终端2 ...
- JDBC03 利用JDBC实现事务提交与回滚【调用Connection中的方法实现事务管理】
目录 1 Connection中的重用方法 2 JDBC事务管理经典案例 1 Connection类中常用的方法回顾 1.1 Statement createStatement() throws SQ ...
- MySQL InnoDB加锁超时回滚机制(转)
add by zhj: 看来我对MySQL的理解还有待深入,水还是挺深的啊,MySQL给记录加锁时,可以通过innodb_lock_wait_timeout参数设置超时时间, 如果加锁等待超过这个时间 ...
- 【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚
原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生, ...
- RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)
摘要: 事务消息提交或回滚的实现原理就是根据commitlogOffset找到消息,如果是提交动作,就恢复原消息的主题与队列,再次存入commitlog文件进而转到消息消费队列,供消费者消费,然后将原 ...
- 关于SAP的事务提交和回滚(LUW)
1 Sap的更新的类型 在sap中,可以使用CALL FUNCTION ... IN UPDATE TASK将多个数据更新绑定到一个database LUW中.程序使用COMMIT WORK提交修改请 ...
- 关于jave在oracle驱动下事务提交与回滚问题
一直以来,都觉得Connection假设设置了setAutoCommit(false)后.启动手工事务提交.必须手工进行commit或者rollback才行.今天正好遇到一个问题.结果大跌眼镜. 于是 ...
- MySQL事务提交过程
一.MySQL事务提交过程(一) MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提交过程. 由于mysql插件式存储架构,导致开启binlog后,事务提交实 ...
随机推荐
- 一起了解 .Net Foundation 项目 No.8
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. IdentityModel ...
- 无线个人区域网WPAN
无线个人区域网WPAN (Wireless Personal Area Network) 1.1.概述 在个人工作地方把属于个人使用的电子设备用无线技术连接起来自组网络,不需要使用接入点 AP. 整个 ...
- 整合 KAFKA+Flink 实例(第一部分,趟坑记录)
2017年后,一大波网络喧嚣,说流式处理如何牛叉,如何高大上,抱歉,工作满负荷,没空玩那个: 今年疫情隔离在家,无聊,开始学习 KAFKA+Flink ,目前的打算是用爬虫抓取网页数据,传递到Kafk ...
- 吐槽苹果开放接口のappleid登陆
这里吐槽一下苹果的开发文档,一切源于前段时间,公司的产品app(某知名资讯app)要接入苹果登陆(ios13发布以来,apple就流氓要求新上线的app,如果有第三方登陆的话,必须要接入appleid ...
- MySQL占用CPU超过百分之100解决过程
本文转载自: https://www.93bok.com 访问网页504 Gateway Time-out,登陆服务器查看,内存正常,CPU使用率达到了400%,因为是4核,所以到了400%,几乎全部 ...
- 《ASP.NET Core 3框架揭秘》读者群,欢迎加入
作为一个17年的.NET开发者,我对一件事特别不能理解:我们的计算机图书市场充斥着一系列介绍ASP.NET Web Forms.ASP.NET MVC.ASP.NET Web API的书籍,但是却找不 ...
- 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 此视频是可 ...
- CSS3:TEXT-SHADOW|BOX-SHADOW(炫彩字体)
2016年2月26日个人博客文章--迁移到segmentfault (1)text-shadow(文本阴影) 在介绍css3:text-shadow文本阴影之前,我们先来看看用它都能实现什么效果: 没 ...
- 数据结构-ST表
数据结构-ST表 不可修改,在线查询的 RMQ 问题. 其中 \(f[i][j]\) 表示 \(i\sim i+(1<<j)-1\) 这段的 RMQ 值. 时间复杂度 \(O(n\log ...
- LaTex公式符号
下面这个网站是我认为比较齐全的网站 http://www.mohu.org/info/symbols/symbols.htm