【原创】想了解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要 有事务呢?事务到底是用来干什么的?我 ...
随机推荐
- c++课程设计:行政区划管理系统
大一的课程设计基本上除了计算器,就是各种管理系统.(大概吧) 感觉看到题目整个一年的c++好像没学明白似的.基础知识掌握还算可以,真刀真枪的打代码,而且是实现这么些功能,做成一个管理系统,就真正感觉到 ...
- [PTA] 1002. 写出这个数 (Basic)
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Sc ...
- sql nvarchar类型和varchar类型存储中文字符长度
今天遇到了,随手记录一下. sql server 存储数据里面 NVARCHAR 记录中文的时候是 一个中文对应一个字符串长度,记录英文也是一个字母一个长度 标点符号也是一样. ...
- python包-logging-hashlib-openpyxl模块-深浅拷贝-04
包 包: # 包是一系列模块文件的结合体,表现形式是文件夹,该文件夹内部通常会包含一个__init__.py文件,本质上还是一个模块 包呢,就是前两篇博客中提到的,模块的四种表现形式中的第三种 # 把 ...
- C# 怎样将DateTime类型进行日期的加减
C#中 DateTime类型有封装好的函数 例如: //将当前时间转换为指定格式的DateTime类型 DateTime dt=DateTime.Parse(DateTime.Now.ToString ...
- 高级MySQL
一.MySQL的架构介绍 1.高级MySQL MySQL内核 SQL优化 MySQL服务器的优化 各种参数常亮设定 查询语句优化 主从复制 软硬件升级 容灾备份 SQL编程 2.MySQL的Linux ...
- linux初学者-网络桥接篇
linux初学者-网络桥接篇 在网络的使用中,有时需要搭建网络桥来实现网络桥接.例如在一台主机上制作一台虚拟机,虚拟机是没有物理网卡的,这时虚拟机数据的发送和接收就需要通过主机上的物理网卡,需要主机的 ...
- Django的性能优化
Django的性能优化 一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引, ...
- C++判断图像中一点是否在矩形中
需要判断出四条之间组成的矩形的范围,其中矩形的边缘可能是倾斜不平行于x或者y轴. 考虑和很久,参考博客http://blog.csdn.net/dapengbusi/article/details/5 ...
- Spring注解浅入浅出——不吹牛逼不装逼
Spring注解浅入浅出——不吹牛逼不装逼 前情提要 上文书咱们说了<Spring浅入浅出>,对Spring的核心思想看过上篇的朋友应该已经掌握了,此篇用上篇铺垫,引入注解,继续深入学习. ...