【原创】想了解Mysql事务,知道这些就够了
Mysql事务:
1. 事务进行一次数据库操作时将数据会存到BufferPoll缓存池中
2. 数据存入缓存池后,Mysql会新建一个线程将数据存入到RedoLogBuffer中
3. 事务提交时RedoLogBuffer中的数据落盘到RedoLogFile中
4. 当服务器崩溃时没有Commit成功的数据都在RedoLogFile中了,未Commit成功的则直接返回给客户端失败信息,
服务器重启后从RedoLogFile中读取出已提交的数据恢复到数据库中
5. 缓存池中的数据根据CheckPoint则是刷新脏页到数据库,又称脏页落盘
事务特性(ACID)
原子性:一个事务中的所有操作要么全部成功,要么全部失败
一致性:事务的开始和结束,数据库的完整性不会被破环
持久性:事务提交后,对数据的修改是永久性的。
隔离性:不同事务之间互不影响,(多版本并发控制机制实现和锁机制)
事务并发出现的问题
①.更新丢失 两个事务同时对一条数据进行操作,eg.a事务将某字段从1000改为1100这是还未提交,
b事务将某字段从1000改为900且提交,这时a事务进行了提交操作。这时该字段的值为1100,b事务的更新丢失。(行锁机制可)
②.脏读 一个事务读取到另一事务还未提交的数据,eg.a事务查询账户余额为2000元,取出1000元,这时b事务开始:读取结果为1000
这是a事务又发生了回滚数据库数据又变成了2000;b事务却只读到1000。(锁机制可实现避免,a写操作b不可读(读写冲突))
③.不可重复读 同一个事务前后两个读取同一条数据的结果不同,读取过程中有其他事务修改了数据,读取到其它事务update/delete的数据
④.幻读 同一个事务前后两次读取同一个表的数据条数不同,读取到其他事务insert的数据
隔离级别分为 ①.读未提交(read-uncommitted) 无法保证任何情况的发生
②.读已提交(RC: read-commit) 可保证避免脏读,但还如果其他事务修改同一条数据后且提交会导致同一条数据在一个事务中前后两次读取到的结果不同
③.可重复读(RR: repeatable-read) 可避免不可重复读
④.可串行化 可避免所有状况的发生
级别越高对消耗的性能越大,一般的数据库默认隔离级别为RC:ReadCommit, MySql的默认隔离级别为RR: Repeatable-Read
MCVV:是为数据库提供并发访问控制的并发控制技术,MVCC读不加锁,写加锁(加排他写锁),读写不冲突。
MVCC是多版本的并发控制技术,其核心理念就是数据快照,不同的事务访问不同版本的快照,这样就使事务间相互隔离,innodb中实现是根据updolog和readview来实现的MVCC。
undolog:数据库数据修改时就会产生一个undolog,这样的话当事务回滚时可根据undolog将数据恢复到之前的状态。
事务链表:RR隔离级别下:当一个事务开启时,innodb会将当前系统中所有的活跃事务ID存入一个链表中,事务被commit时从链表中移除
RC隔离级别下:每一个语句开始时,innodb就会将当前系统中所有的活跃事务ID存入一个链表中,事务被commit时从链表中移除。
readview:MVCC对同一数据会有多个不同版本的UndoLog, 那么如果当前系统中有活跃的事务,那么这时一个新的事务要查询该数据,这时应该需要查询哪个版本呢
就需要使用readview来控制
该事务的事务链表及ReadView结构如下
事务链表:ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3; trx11等均为当前活跃事务的ID
readview:
read_view->creator_trx_id = ct-trx; 当前事务ID
read_view->up_limit_id = trx3; 低水位
read_view->low_limit_id = trx11; 高水位
read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];
如果读取到的行数据的事务ID 大于 low_limit_id 高水位,说明这个数据的事务是在当前事务后面后面完成的,则不可见
如果读取到的行数据的事务ID 小于 up_limit_id 低水位,则说明这个数据的事务在本事务开启之前已经不再活跃,即已提交过的,则该数据可见
如果读取到的行数据的事务ID 在低水位和高水位之间,则看当前事务的read_view的事务链表中是否存在该事务ID,
如存在则说明,当前事务开启时,这个数据的事务正在活跃还未提交所以不可见,如果不存在则可见
【原创】想了解Mysql事务,知道这些就够了的更多相关文章
- 【原创】新说Mysql事务隔离级别
引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- 面试总结:关于MySQL事务的10个问题常见面试问答(FQA)
学习关系型数据库MySQL是很好的切入点,大部分人工作中用惯了CRUD,对面试官刨根问底的灵魂拷问你还能对答如流吗?我们有必要了解一些更深层次的数据库基础原理. 文章每周持续更新,各位的「三连」是对我 ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- php mysql事务
这里记录一下php操作mysql事务的一些知识 要知道,MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.但是,在使用事务时,是需要执行多条sq ...
- MYSQL事务和锁
mysql事务(一)—转载 2012年12月20日 ⁄ Mysql数据库, 技术交流 ⁄ 暂无评论 一. 什么是事务 事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割 ...
- MySQL系列(二)---MySQL事务
MySql 事务 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 什么是事务(transaction) 保证成批操作要么完全执行,要么完全不执行,维护数据的完整性.也 ...
- MYSQL事务及存储引擎对比
Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性 ...
- MySQL(十三)之MySQL事务
前言 这段时间自己会把之前学的东西都总结一遍,希望对自己以后的工作中有帮助.其实现在每天的状态都是很累的,但是我要坚持! 进入我们今天的正题: 为什么MySQL要 有事务呢?事务到底是用来干什么的?我 ...
随机推荐
- oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER
遇到问题: INTERVAL DAY TO SECOND, 但却获得 NUMBER 操作步骤 在查询oracle数据库的时候使用到了系统提供的函数:trunc ( trunc(tb.safedate ...
- Node + js实现大文件分片上传基本原理及实践(一)
_ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...
- spring 事务隔离级别导致的bug
事情是这样的,ios进货单有一个数量加一手,减一手的功能,每加减一次就会异步调用后台的接口,后台判断sku如果不存在就插入,存在就更新. 问题描述: 当ios发了多次请求后, 在第二次请求的时候, ...
- [填坑] ubuntu检测不到外接显示器
笔记本是win10+ubuntu18双系统,今天ubuntu(开启nivida独显状态)突然无法连外接屏幕,但切换win10就可以显示. 贴吧找到的简单解决方法,不需要重装驱动,记录分享在这里: su ...
- 阅读nopcommerce startup源码
创建一个asp.net core项目,可以到到startup类有两个方法 // This method gets called by the runtime. Use this method to a ...
- 【eclipse】No enclosing instance of type A is accessible. Must qualify the allocation with an enclosing instance of type A
用 eclipse 写 Java 代码时出现了这个问题,详细如下: No enclosing instance of type TestParsingLinkedList is accessible. ...
- 反应式微服务框架Flower
Flower是一个构建在Akka上的反应式微服务框架,开发者只需要针对每一个细粒度的业务功能开发一个Service服务,并将这些Service按照业务流程进行可视化编排,即可得到一个反应式系统. 即时 ...
- 什么是https?http升级为https需要什么?
一.什么是https? https是一种加密传输协议,网站使用https后可以避免敏感信息被第三方获取.https加密协议=SSL / TLS+http协议,也就是说,在传统的http协议上加上SSL ...
- centos开发环境安装
执行 yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel ...
- mysql 查询结果显示行号
mysql 查询时,不像oracle那样,可以直接用 rownum 显示结果行号. 可以用定义用户变量来实现 set @myrnum = 0; select (@myrnum := @myrnum + ...