【原创】想了解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要 有事务呢?事务到底是用来干什么的?我 ...
随机推荐
- Linux vim环境设置
//vim /etc/vimrc(管理员权限) 1. 显示行号: set number 或者 set nu 不显示行号: set nonu 2.自动缩进: set autoindent 3.C语言自 ...
- jsp对数据库的使用
JDBC由Sun公司制定,全称JavaDataBase Connectivity,是一种可以执行SQL语句并可返回结果的javaAPI,支持多种关系型数据库,封装在Java.sql.* 它的具体位置在 ...
- Android的简述3
Activity的生命周期 Activity类中有许多onXXX形式的函数可以重载,比如onCreate,onStart,onStop,onPause,那么它们的调用顺序到底是如何的呢?下面就通过一个 ...
- bean的创建(五)第三部分 bean工厂方法参数的解析
准备好一系列参数之后,开始参数类型的转换,方法参数的对应. ConstructorResolver.createArgumentArray private ArgumentsHolder create ...
- Spring Boot @Condition 注解,组合条件你知道吗
上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationProperties 注解灵活读取配置属性,这篇文 ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- codeforces 371A K-Periodic Array
很简单,就是找第i位.i+k位.i+2*k位...........i+m*k位有多少个数字,计算出每个数出现的次数,找到出现最多的数,那么K-Periodic的第K位数肯定是这个了.这样的话需要替换的 ...
- 【python-django后端开发】Redis缓存配置使用详细教程!!!
官方查阅资料:https://django-redis-chs.readthedocs.io/zh_CN/latest/ 1. 安装django-redis扩展包 1.安装django-redis扩展 ...
- commons-logging + log4j源码分析
分析之前先理清楚几个概念 Log4J = Log For Java SLF4J = Simple Logging Facade for Java 看到Facade首先想到的就是设计模式中的门面(Fac ...
- ibatis 核心原理解析
最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码.虽然最后证明问题的原因与 ibatis 无关,但是这个过程加深了对 ibatis 框架原理的理解. 这篇文章主要就来讲讲 ibati ...