粗谈MySQL事务的特性和隔离级别
网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。
前言
此篇文章作为自己学习MySQL
的一些个人理解,使用的引擎是InnoDb
。首先先讲讲事务的概念,在《高性能MySQL》第三版
中其对事务的描述是这样的:
事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。
换句话说,事务就是一个整体单位,里面的SQL
语句不会单独执行,就像某些商品一般,由多个组件组成,但是我绝对不单独卖组件,要买就买整个商品,不然就不卖。
简单的理解了事务之后,还需要知道事务的目的就是为了保证数据的正确性和一致性,那么为此则诞生出其4
个特性(后面再细讲),而为了实现这四个特性又需要许多具体的实现,其中就包括为了隔离性而产生的四个隔离级别,这四种隔离级别又产生了三个问题(脏读
、不可重复读
和幻读
),这就是其大致的关系,接下来让我们来看看这些具体到底是个什么东西。
1 四种特性(ACID)
说起事务的特性,那肯定张口就来ACID
,然而除了ACID
之外我们还是需要说点其他东西的。
原子性(Atomicity)
:意思是说一个事务应当作为一个不可分割的最小单位,整个事务的操作要么全部执行成功要么全部不执行,像原子一样不可分割(别跟我谈夸克),这里的执行是指执行成功,如果有一个操作执行失败了那么就全部不执行,这也是我们平时见到的回滚。
一致性(Consistency)
:书上给出的意思是事务总是从一个一致性的状态跳到另一个一致性的状态。我的理解是在涉及到的数据范围内是守恒的,也就是说,整体的数据是不变的,拿万能的转钱例子来说,A
账户转给B``200
元,那么由A
和B
组成的这个数据范围来说数据并没有发生改变(-200+200=0)
,只是数据的组成方式变化了,所以是从一个一致性状态—>另一个一致性状态。
隔离性(Isolation)
:通常来说,一个事务的操作对于其他的事务的不可见的,也就是说一般而言事务都是独立的。但是这跟数据库的隔离级别有关,除了某个(没错,就是你——读未提交同学)隔离级别之外,其他的都是不可见的,而这种事务可见的级别很少用到,所以说的是'通常来说'。
持久性(Durability)
:事务一旦完成,那么该事务引起的数据变化将永久生效,不会改变(除非被另外一个事务改动)。不过书上提到这其实跟实行的策略相关,但这貌似就有点走远了(是的,我不懂!)。
以上就是事务的四种特性,然而其中隔离性的实现则是要看数据库的隔离级别。
2 数据库的隔离级别
在MySQL
中隔离级别有四种,每种隔离级别对应的事务体现不同,可能出现的问题也各自不同。
未提交读(read uncommited)
:在这个隔离级别中,在一个事务执行的操作就算不提交也能被其他的事务看到。在这个级别中一个事务可能读到其他事务还没提交的脏数据,即可能出现脏读。如下图所示,序号表示执行的顺序。
可以看到,在界面1
的事务中往test
表插入了一条数据,此时就算还没提交在页面2
的另一个事务中也可以看到提交的数据。
提交读(read commited)
:在一个事务提交之后,其他事务才可以看到事务的修改。此隔离级别可能会出现同一个事务中执行相同的查询却读到不同的数据,即不可重复读(nonrepeatable read
),另未提交读也可能出现不可重复读。例子如下
可重复读(repeatable read)
:这是MySQL
的默认隔离级别,在事务开始的时候会保存此刻的一个快照(这里啰嗦一下,实际上是开启事务后执行第一条语句的时候准备的快照,准备快照的方法则是记录当前事务的版本号,没有进行数据的复制,不明白事务版本号或隐藏字段的可以看看MySQL
的MVCC
),然后接下来这个事务的所有数据读取都是从这个快照读,所以不会出现不可重复读的情况,但是还是有可能出现幻读。意思就是读取的是快照表数据不会变化,但是进行写操作如更新的时候更新的数量可能会跟预期的不同。如图
可以看到,在界面1
插入一条记录并且提交之后,界面2
还是没有读到这个提交的数据,因为他是从事务开始时的快照表读取的所以自然是读不到的,但是在进行更新操作的时候则是更新了意料之外的记录,这就是一种幻读的现象。
可串行化(serializable)
:意思就是事务要一个一个来,如果在一个事务中进行读操作,那么其他事务在该事务完成前只能进行读操作;如果进行写操作,那么其他事务的操作都进入等待(直到当前事务提交)。这种级别就可以防范目前出现的脏读、不可重复读、幻读等现象。如图
上图演示的是事务读时,其他事务不可写,下图是写时不可操作。
3 三个问题—脏读、不可重复读、幻读。
这是采取事务的不同隔离级别可能产生的几个问题,在上面隔离级别已经提及到了,但是为了避免混淆还是单独拿出来。
脏读
:指在一个事务中读到了其他事务还没提交的脏数据,发生在读未提交级别。不可重复读
:在一个事务中同样的查询可能出现不同的结果,发生在读未提交、读提交级别。(个人觉得没必要特意去理解为叫什么叫不可重复,容易混淆)幻读
:在一个事务中进行写操作的时候修改的数量跟预期的数量不同,例如修改到了之前查询不出来的数据。
再啰嗦一些不可重复读
和幻读
的区别:可以理解为不可重复读是
那条记录的字段值改变了,例如id
为1
的记录中name
的两次值都不同;而幻读
则是数量上的不同,例如我查询的时候共有2
条记录,但是执行修改操作的时候却更新了3
条。
参考:《高性能MySQL》,http://www.zsythink.net/archives/1233/
或许我只是简单的想被认可。
粗谈MySQL事务的特性和隔离级别的更多相关文章
- 【MySQL】:事务四大特性与隔离级别
目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...
- MySQL事务及实现、隔离级别及锁与优化
事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.事务是逻辑上的一组操作,要么都执行,要么都不执行. ACID简介 原子性(Atomicity) ...
- spring 事务传播特性 和隔离级别
事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...
- 数据库事务ACID特性及隔离级别
数据库ACID特性介绍 1.原子性(Atomic)一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性,要支持回 ...
- MySQL事务的四种隔离级别
事务的基本要素: 原子性(atomicity):事务开始后的全部操作, 要么全部执行成功,如果中间出现错误,事务回滚到事务开始前的状态. 一致性(Consistency):事务开始后,数据库的完整性约 ...
- Java数据库事务四大特性以及隔离级别
四大特性ACID 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.失败回滚的操作事务,将不能对数据库有任何影响 一致性(Consistency) 一致性是指事 ...
- 【JAVAWEB学习笔记】19_事务概述、操作、特性和隔离级别
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- 【Mysql】事务的四种特性和隔离级别
四种特性: 原子性(Atomicity):事务里所有操作视为一个整理,要么全部完成,要么全回滚. 一致性(Consistency):操作前后,数据库内数据逻辑上一致.比如:1w元转账给不同的人,转出去 ...
- 一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1 .mysql索引结构,各自的优劣 2 .索引的设计原则 3 .mysql锁的类型有哪些 4 .mysql执行计划怎么看 ...
随机推荐
- TCP/IP IGMP:Internet组管理协议
1.概述 IGMP协议,让一个物理网络上的所有系统知道主机所在的多播组,ICMP作为IP层的一部分,通过IP数据报进行传输,有固定的报文长度.通过IP首部协议字段值为2指明 类型为1说明是多播路由器发 ...
- 牛客挑战赛17E 跳格子 计数dp
!!!学长做过的题 正解:计数dp 解题报告: 传送门 首先思考,这题和普通的走台阶有什么区别嘛(跳格子其实和走台阶都一样的嘛quq因为走台阶比较经典所以就说的走台阶) 那显然最大的区别就是它有限制 ...
- 让Antd Modal变成可拖动弹窗
思路: 1.首先需要两个DIV,一个是和视口一样大drag-mask,绑定mouseMove事件和mouseUp事件,另一个是和Modal一样大的drag-target,绑定mouseDown事件: ...
- Angular.的简单运用
从script引用angular文件.开始编写angular事件: 在angular文件中添加属性: ag-xxxx;初始化使用: ng-app="name"; 没有这个属性就不会 ...
- 6年iOS开发被裁员,是行业的饱和还是经验根本不值钱?
前言: 最近看到很多iOS开发由于公司裁员而需要重新求职的.他们普遍具有4年甚至更长的工作经验.但求职结果往往都不太理想. 我在与部分iOS开发者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实, ...
- IDEA 配置及常用快捷键
常用快捷键 1.Ctrl+Alt+T 把选择的代码放入 try{} 或者 if{} 里 2.Ctrl+O 重写方法提示 3.Alt+回车 导包提示 4.Alt+/ 代码提示(默认不是这个,需要参照后文 ...
- 【转】常见Java面试题 – 第四部分:迭代(iteration)和递归(recursion)
ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.请写一段代码来计算给定文本内字符“A”的个数.分别用迭代和递归两种方 ...
- 【DPDK】【Multiprocess】一个dpdk多进程场景的坑
[前言] 这是一个隐藏了近3年的问题,理论上只要用到DPDK multiprocess场景的都会遇到这个问题,具体出不出问题只能说是看运气,即使不出问题也仍然是一个风险. [场景] 我先描述一下这个问 ...
- Spirng Boot2 系列教程(二十二)| 启动原理
一个读者,也是我的好朋友投稿的一篇关于 SpringBoot 启动原理的文章,才大二就如此优秀,未来可期. 我一直想了解一下 SpirngBoot 的是如何启动的,我想就来写一篇关于 SpirngBo ...
- Milking Cows 挤牛奶 USACO 排序 模拟
1005: 1.2.1 Milking Cows 挤牛奶 时间限制: 1 Sec 内存限制: 128 MB提交: 15 解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1 ...