【原创】想了解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要 有事务呢?事务到底是用来干什么的?我 ...
随机推荐
- .net持续集成sonarqube篇之sonarqube基本操作(一)
系列目录 Sonarqube Web管理界面虽然设计的简洁大方,也非常直观,但是由于功能繁多,这对快速入手以及快速定位到想要的功能都是一个挑战,在以后的几个小节里我们简要介绍. OwerView(概览 ...
- springboot启动不设置端口
非web工程 在服务架构中,有些springboot工程只是简单的作为服务,并不提供web服务 这个时候不需要依赖 <dependency> <groupId>org.spri ...
- ubuntu16.04服务器上无root权限,配置个人tensorflow环境--cuda9.0+cuDNN7+tensorflow-gpu-1.8
本人在服务器上已经用Anconda创建好python3.5的环境,这个网上有一大堆教程.接下来是重点. 1. cuda的安装 https://developer.nvidia.com/cuda-dow ...
- difflib python
difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. 例子: # -*- ...
- SSM-员工管理系统Demo---带分页和校验(含源码)
页面展示: 前端JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- JDBC秒变C3P0连接池——再加连接解耦
从JDBC连接到C3P0数据库连接池 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ② ...
- 【iOS】沙盒目录
有关沙盒目录参考: http://blog.csdn.net/totogo2010/article/details/7669837 获取沙盒路径,参考代码: NSArray *paths = NSSe ...
- 完美解决windows10磁盘占用100%并出现卡顿、假死无反应
完美解决windows10磁盘占用100%并出现卡顿.假死无反应 想必大家也跟我一样,自从用win10系统以后经常会出现这种情况:磁盘突然占用100%然后开始出现假死现象,电脑卡住,点击任何软件没反应 ...
- hive分桶表bucketed table分桶字段选择与个数确定
为什么分桶 (1)获得更高的查询处理效率.桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构.具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map ...
- 单元测试python unittest
记录自己学习单元测试框架的一篇博客 菜鸟的学习之路比较艰辛到处找资料一把辛酸泪啊 1.首先是创建一个类里面设计一些简单的函数方便写用例: 原谅我蹩脚的英文直接用拼音命名了 : 2.接着就是创建用例文件 ...