文章转载自老周聊架构,侵删!!!

一、什么是事务

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。

二、事务的四个特性

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

三、MySQL的四种隔离级别


Read uncommitted

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。

事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。


那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。


Read committed

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…

分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。


那怎么解决可能的不可重复读问题?Repeatable read !


Repeatable read

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。


什么时候会出现幻读?

事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。


那怎么解决幻读问题?Serializable!


Serializable 序列化

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。


值得一提的是:大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

四、测试Mysql的隔离级别

下面,将利用MySQL的客户端程序,我们分别来测试一下这几种隔离级别。

测试数据库为test,表为test_isolation;表结构:

CREATE TABLE `test_isolation` (
`id`  int(10) unsigned NOT NULL AUTO_INCREMENT ,
`num`  int(10) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。

(一)、将A的隔离级别设置为read uncommitted(未提交读)

A: 启动事务,此时数据为初始状态

B: 启动事务,更新数据,但不提交

A: 再次读取数据,发现数据已经被修改了,这就是所谓的“脏读”

B: 回滚事务

A: 再次读数据,发现数据变回初始状态

经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。

(二)、将客户端A的事务隔离级别设置为read committed(已提交读)

A: 启动事务,此时数据为初始状态

B: 启动事务,更新数据,但不提交

A: 再次读数据,发现数据未被修改

B: 提交事务

A: 再次读取数据,发现数据已发生变化,说明B提交的修改被事务中的A读到了,这就是所谓的“不可重复读”

(三)、 将A的隔离级别设置为repeatable read(可重复读)

A: 启动事务,此时数据为初始状态

B:启动事务,更新数据,但不提交

A: 再次读取数据,发现数据未被修改

B: 提交事务

A: 再次读取数据,发现数据依然未发生变化,这说明这次可以重复读了

B: 插入一条新的数据,并提交

A: 再次读取数据,发现数据依然未发生变化,虽然可以重复读了,但是却发现读的不是最新数据,这就是所谓的“幻读”

A:提交本次事务,再次读取数据,发现读取正常了

由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。

( 四)、 将A的隔离级别设置为 可串行化(Serializable)

A: 启动事务,此时数据为初始状态

B: 发现B此时进入了等待状态,原因是因为A的事务尚未提交,只能等待(此时,B可能会发生等待超时)

A: 提交事务

B:发现插入成功

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。

一文搞懂数据库的四种隔离级别(建议收藏)相关推荐

  1. 数据库的四种隔离级别及对应解决的脏读、不可重复读、幻读问题

    数据库的四种隔离级别 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且, ...

  2. 【数据库的四种隔离级别】

    在关系型数据库中,隔离级别是指多个事务并发执行时,彼此之间的隔离程度.数据库的四种隔离级别如下: 1.读未提交(Read Uncommitted): 最低级别的隔离级别,一个事务可以读取到另一个事务未 ...

  3. MySQL数据库的四种隔离级别

    一.首先介绍几个概念: 1,脏读: 又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的 ...

  4. 一文搞懂 Cocos Creator 3.x 坐标转换!建议收藏

    Cocos Creator 3.x 如何将世界坐标转屏幕坐标?Creator 3D 怎么将 3D 坐标转化到 Canvas 上面?触摸的屏幕坐标如何转世界坐标?怎么把 Canvas 下的节点坐标转换为 ...

  5. 数据库的脏读、不可重复读、幻读以及四种隔离级别

    一.数据库的脏读.不可重复读和幻读 1.脏读: (读取了未提交的新事物,然后被回滚了) 事务A读取了事务B中尚未提交的数据.如果事务B回滚,则A读取使用了错误的数据. 比如我给你转了100万,但是我还 ...

  6. 一文搞懂数据库锁知识

    数据库锁知识(INNODB) 库锁 表锁 MDL锁 意向锁 在线DDL的效率问题 锁升降级机制 行锁 四种隔离级别 行锁的分类 行记录锁(Record Locks) 间隙锁(Gap Lock) 临键锁 ...

  7. 数据库(Mysql)的四种隔离级别

    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且,在事务的并发操作中可能 ...

  8. 数据库难点:脏读、幻读、不可重复读与四种隔离级别

    目录 前言 一.什么是事务? 二.事务的ACID特性 (1)原子性 (2)一致性 (3)隔离性 (4)持久性 三.何为脏读,幻读,不可重复读? 四.四种隔离级别 前言 本章着重点是介绍:出现脏读.幻读 ...

  9. 数据库事务的四种隔离级别

    文章目录 1. 引言 2. 事务隔离级别 2.1 事务四种隔离级别 2.2 查看隔离级别 3. 脏读/幻读/不可重复读 3.1 脏读 3.2 不可重复读 3.3 幻读 4. 总结: 1. 引言 &qu ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装字体管理器font-manager
  2. Perl 校验命中的脚本
  3. Task01——零基础入门NLP - 新闻文本分类之赛题理解
  4. linux下的daemon进程
  5. Java基本类型和取值范围
  6. Android实现富文本时遇到的一些问题(2)字体效果的保存
  7. 机器人布里茨说什么_LOL蒸汽机器人布里茨英雄介绍、技能加点、技巧攻略 机器人出什么装备...
  8. Swift之深入解析如何进行多重条件排序
  9. centos 忘记 root 密码
  10. session一些基本的东西
  11. include做配置文件
  12. wegwegwegwegweg
  13. 我的计算机用户账户logo,UserAccountControl
  14. 水晶报表攻克系列3-如何在程序中自定义纸张
  15. Spring Boot菜鸟示例——Hello World
  16. 【编译原理系列】语法分析与上下文无关文法
  17. 3S基础知识:MapInfo教程--二次开发入门
  18. gif透明背景动画_常用的设计文件格式——jpg、png、gif、psd、ai、cdr、tiff
  19. 计算机缓存加速网络,教你win7怎么清理缓存为电脑提速
  20. 华为android o适配名单,华为给出首批升级名单,这8款华为手机率先适配Android Q 10系统...

热门文章

  1. win7(amd显卡) 安装 pyopencl
  2. http://blog.csdn.net/txx9010/article/details/7710739
  3. 扩展坞可以把手机投到显示器吗_你真的会用手机吗?这款ORICO多功能扩展坞可以让手机变的更强大...
  4. 一个简单的Python脚本实现SOCKS5代理服务器的基本功能
  5. matlab预处理光谱数据,一种近红外光谱数据预处理方法与流程
  6. Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法
  7. 101个python小代码 (3)给三个数字排列顺序(从大到小)
  8. python仿360界面_python实现360的字符显示界面 -电脑资料
  9. 9 个很酷的 CMD 命令
  10. 栈内存和堆内存的区别与原理