redo mysql mvcc_Mysql事务中的ACID是怎么实现的
首先明确几个概念:
事务的四大特征,redo log,undo log,mysql锁技术(共享锁/排他锁),MVCC
四大特性(ACID)
1.原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响。
2. 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
例如:A和B进行转账操作,A有200块钱,B有300块钱;当A转了100块钱给B之后,他们2个人的总额还是500块钱,不会改变。
3. 隔离性(Isolation)
隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。
例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要么在T1执行完成后才开始。将多个事务隔离开,每个事务都不能访问到其他事务操作过程中的状态;就好比上锁操作,只有一个事务做完了,另外一个事务才能执行。
4. 持久性(Durability)
持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
redo log
重做日志,是用来实现事务的持久性。重做日志缓冲(redo log buffer)(内存中)以及重做日志文件(redo log)(磁盘中)。当事务提交之后会把所有修改信息都会存到该日志中。
实例:把张三的银行账户中的余额转到他的理财账户中。
sql实现:
start transaction;select balance from bank where name="zhangsan";update bank set balance = balance - 400;update finance set amount = amount + 400;commit;
redolog的工作流程图
作用:mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。
说简单点就是redolog就是存执行sql的日志,万一数据丢失了,可以从日志里读取,重新执行,保证了事务持久性的特点。
undo log
回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。
作用:undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。
说简单点就是保存redolog里面的反向sql日志,发生异常回滚的时候执行undo log里面的sql,回滚的事务执行以前,也就是事务回滚的原理,也就是他保证了事务的原子性。
Mysql共享锁/排他锁
1、共享锁(shared lock),又叫做"读锁":读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。就是说可以多个人或者多个线程来读,但是不能进行写操作。
2、排他锁(exclusive lock),又叫做"写锁":写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。就是说只能一个人或者一个线程来操作,可以读也可以写。
总结:通过读写锁,可以做到读读可以并行,但是不能做到写读,写写并行。
MVCC
通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。
MVCC在mysql中的实现依赖的是undo log与read view
undo log :undo log 中记录某行数据的多个版本的数据。
read view :用来判断当前版本数据的可见性
说简单点就相当于乐观锁,有了版本号的概念,每行数据都有版本,只能读取到与自己版本相同的数据,要是版本不同就升级版本
事务的隔离性是通过 (读写锁+MVCC)来实现的,而事务的一致性,就是上述所说的redolog,undolog,(读写锁+mvcc)共同来实现的。
redo mysql mvcc_Mysql事务中的ACID是怎么实现的相关推荐
- mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解
前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...
- MySQL数据库事务中的行级锁,表级锁,页级锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- mysql innodb事务中 出现_MySql InnoDB事务死锁问题
这篇博客的文章内容发生于某天晚上服务端日志报了一大堆 Deadlock found when trying to get lock; try restarting transaction,当时通过字面 ...
- MySQL 5.7中对XA支持的改进
介绍 XA的意思为"eXtended Architecture",是The Open Group组织为分布式事务处理创建的标准.虽然MySQL 5.0是第一个支持XA的版本,但My ...
- mysql+实例夯住的监控_Nagios 里面监控MySQL 监控事务夯住(RUNNING)报警通知
序言: 业务报警订单提交异常,页面一直没有反应,排查后是事务没有提交或者回滚导致,想到如果及时监控事务的运行状态报警出来,那么就可以及时排查出问题所在,方便运营处理,所以自己就弄了一个shell脚本放 ...
- mysql怎么实现事务序列化_一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...
- mysql内部实现原理面试_理解完这些基本上能解决面试中MySql的事务问题
事务是指逻辑上的一组操作,要么都执行,要么都不执行, 事务的特性(ACID)原子性(Atomicity):事务是不可分割的工作单元,要么都成功,要么都失败, 如果事务中一个sql语句执行失败,则已执行 ...
- MySQL DBA亲授MySQL InnoDB事务ACID实现原理
说到数据库事务,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念.其实事务的本质就是锁.并发和重做日志的结合体. 这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原 ...
- mysql innodb禁用事务_MySQL InnoDB事务中锁问题(三)
试想,事务如果都是串行的,那么就不需要锁了,但是性能肯定没法接受.加锁只是为了提高事务并行度,并且解决并发事务执行过程中引起的脏写.脏读.不可重复读.幻读这些问题的一种解决方案(MVCC算是一种解决脏 ...
- mysql事务最好别用_理解完这些基本上能解决面试中MySql的事务问题
前言 在面试中,基本上都会问到关于数据库的事务问题,如果啥都不会或者只回答到表面的上知识点的话,那面试基本上是没戏了,为了能顺利通过面试,那MySql的事务问题就需要了解,所以就根据网上的资料总结一版 ...
最新文章
- 咏南CS插件开发框架也可BS方式部署
- 谷歌全新轻量级新模型ALBERT刷新三大NLP基准
- Sql — CTE公用表表达式和With用法总结
- C#判断奇偶数的函数
- 云计算里AWS和Azure的探究(2)
- C++实现井字棋小游戏(写得不好,留作纪念!!!)
- 27.产品经理需要具备的数据分析能力
- Ubuntu18.04下使用docker制作ubuntu20.04镜像
- 【一分钟知识】依存句法分析
- java 修改字体大小
- 国图软件无法生成地籍调查表
- Matlab GUI界面设计
- win10教育版加域提示错误
- 数字化时代,如何提高企业的交易管理效率?
- Annoying Present
- hive中order by、distribute by、sort by和cluster by的区别和联系
- 如何教你获取1688店铺所有商品,商品详情数据分析
- 使用Qt实现阿里云API签名
- js动画效果(移动、变化效果)实现整理
- 几款软件,内有很多人求而不得的破解版TeamViewer
热门文章
- CentOS 6.x通过yum安装php7.1及相关环境
- (个人)Linux基本指令收集
- 如何将Java Web项目部署到服务器上
- 叶脊网络拓扑(leaf-spine)
- Java异常框架设计
- NClay框架AOP功能简介
- mysql generic安装_MySQL 5.7 linux generic 版本安装
- oracle删除数据用户,oracle删除用户及表空间,导入用户和数据
- python 通过模板生成文章_自动生成文章_python自动生成文章 - 云+社区 - 腾讯云
- linux下好用的截图工具,Linux系统下一款比较易用的截图工具