文档章节

MySQL事务隔离级别

秋风醉了
 秋风醉了
发布于 2014/04/02 13:13
字数 1526
阅读 358
收藏 0

MySQL事务隔离级别

  • 事务就是一组原子性的sql查询,或者说一个独立的工作单元

  • 事务内的语句,要么全部执行,要么全部执行失败

  • 事务的ACID属性:原子性,一致性,隔离性,持久性

  • 原子性:一个事务被视为不可分割的最小工作单元

  • 一致性:数据库总是从一个一致性的状态转到另一个一致性的状态

  • 隔离性:一个事务所做的修改在最终提交之前,对其他事务不可见

  • 持久性:一旦事务提交,其所做的修改永久保存到数据库中

四种事务隔离级别的概述

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

 

事务隔离级别

四种隔离级别:READ UNCOMMITTED(未提交读),READ COMMITTED(提交读),REPEATABLE READ(可重复读),SERIALIZABLE(可串行化)

  • READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也成为脏读(Dirty Read)。在实际中,一般很少应用

  • READ COMMITTED(提交读):解决了脏读问题,大多数的数据库默认的隔离级别是READ COMMITTED(提交读)(但MySQL不是),一个事务开始前,只能看见已经提交的事务所做的修改

  • REPEATABLE READ(可重复读):解决了脏读和不可重复读的问题。该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。‍‍所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制解决了幻读的问题。‍‍

  • SERIALIZABLE(可串行化):是最高的隔离级别。通过强制事务串行执行,避免了前面说的幻读问题。简单的说,serializable会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。可以根据实际情况使用该级别

mysql设置隔离级别:

SET   TRANSACTION   ISOLATION   LEVEL

 

脏读(Dirty Read)

事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也成为脏读(Dirty Read)。举例:字段值为500,事务A修改字段值为1000,事务B读取到了字段的值为1000,这就是脏读。

 

不可重复读(Non-repeatable Read)

不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

 

幻读(Phantom Read)

所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制解决了幻读的问题。

 

死锁(Deadlock)

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象

数据库系统实现了各种死锁检测和死锁超时机制

 

MySQL事务

MySQL的两种事务型的存储引擎:InnoDB和NDB Cluster。

  • 自动提交(AUTOCOMMIT):MySQL默认采用自动提交模式。当autocommit=0时,所有的查询都是在一个事务中,直到显示的执行commit提交或rollback回滚,该事务结束,同时又开始了另一个新事务。

  • 在事务中混合使用存储引擎:事务是由下层的存储引擎实现的。所以在同一个事务中,使用多种存储引擎是不可靠的。如果在事务中使用了事务性和非事务性的表(例如InnoDB和MyISAM表),在正常提交的情况下没有问题,但如果该事务需要回滚,非事务型的表上的变更就无法撤消,这会导致数据库不一致的状态,这种情况很难修复,事务的最终结果也无法确定。所以为每张表选择合适的存储引擎很重要。

  • 隐式和显示锁定:InnoDB采用两阶段锁定协议。在事务执行过程中,随时都可以执行锁定,锁只在执行COMMIT或者ROLLBACK的时候才会释放,并且所有的锁是在统一时刻被释放。InnoDB会根据隔离级别在需要的时候自动锁定。InnoDB支持通过特定的语句进行显示锁定。

============END============

© 著作权归作者所有

秋风醉了
粉丝 253
博文 532
码字总数 405557
作品 0
朝阳
程序员
私信 提问
加载中

评论(0)

mysql 4种事务隔离级别

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(...

蛋定龙
2015/10/23
361
1
MySQL MVCC && 事务隔离级别 && 锁

MySQL MVCC && 事务隔离级别 && 锁 InnoDB多版本并发控制——MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySQLS锁X锁read lockwrite lock http://my.oschina.net/xinxingegeya/bl......

秋风醉了
2014/07/30
646
0
MySQL/MariaDB中的事务和事务隔离级别

本文目录: 1.事务特性 2.事务分类  2.1 扁平事务  2.2 带保存点的扁平事务  2.3 链式事务  2.4 嵌套事务  2.5 分布式事务 3.事务控制语句 4.显式事务的次数统计 5.一致性非锁定读(快照...

shunfa888
前天
0
0
Mysql数据库理论基础之九---四类隔离级别

一、简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1、是一种数据库管理系统 2、是一种关联数据库管理系统 3、是一种开放源码软件,且有大量可用的共享MySQL软...

风过_无痕
2017/06/10
0
0
【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

01 概述 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数...

OliverFinn
03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据结构导论之第七章排序

一、概念 数据排序 :排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。 稳定排序 :若排序后,相同关键字的记录保持它们原来的相对次序,则此排序方法称为稳定排序...

osc_wdq5dwoy
7分钟前
3
0
数字签名与数字证书的原理

在了解数字签名和数字证书之前,可以先了解一下加密算法的一些常见分类,我之前写了一篇介绍常见加密算法的文章。https://www.cnblogs.com/mysticbinary/p/12615063.html 将军与士兵通信 --...

osc_rjwgyutp
8分钟前
5
0
一篇文章让你了解动态数组的数据结构的实现过程(Java 实现)

目录 数组基础简单回顾 二次封装数组类设计 基本设计 向数组中添加元素 在数组中查询元素和修改元素 数组中的包含、搜索和删除元素 使用泛型使该类更加通用(能够存放 “任意” 数据类型的数...

osc_zqxv5pte
10分钟前
7
0
哪里有全新银行卡买

哪里有全新银行卡买【十:230扣288扣882 号】>>实体店消费几分钟就可办好,远程可上门或到店办理实体店消费几分钟就可办好大公司面试无论是实习还是校招,普遍存在面试轮次多,

230扣288扣882
11分钟前
5
0
字节头条的一道代码题,面试题

题目: 有一个键盘,只有a-z的26个英文字母的输入按键,现在键盘有两个按键坏了, 按i键,会退格,等同于常规键盘的backspace键, 按o键,会撤回上一步,效果等同于win系统的ctrl+z, 要求实...

osc_u61lmlkv
11分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部