MySQL事务隔离机制详解

目录
  • 前言
  • 一、什么是数据库事务
  • 二、事务并发带来的4类问题
  • 三、事务4种隔离级别
  • 四、Mysql演示4种隔离级别
  • 总结
  • 参考文章:

前言

如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机制、锁机制、MVCC机制,用一整套机制来解决并发问题,本文主要介绍事务隔离机制。

一、什么是数据库事务

事务transaction(简写tx),在数据库中,事务是指一组逻辑操作,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与结束之间执行的全部数据库操作组成

事务具有以下4大特性,简称ACID:

1、原子性(Atomicity)
事务是一个原子操作单元,是不可分割的最小工作单元,就像化学中的原子,其对数据的修改,要么全都执行,要么全都不执行

2、一致性(Consistent)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
一致性也称作是完整性,就是说事务的执行不能破坏数据库的一致性,在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性

3、隔离性(Isolation)
数据库提供一定的隔离机制,当多个事务并发访问时,保证事务在不受外部并发操作影响的“独立”环境执行,当然了,不同的隔离级别决定了有多“独立”。

4、持久性(Durable)
事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

小结:原子性,持久性大家基本都能秒懂,隔离性也还好大家稍微想想都能理解,就是接下来要讲的隔离级别,但对一致性很多人被官方概念绕住了,其实就是在多事务并发时要保证数据的一致和完整,不理解的话先看下面的问题。

二、事务并发带来的4类问题

1、脏读(Dirty Reads)
事务A读取到了事务B修改但尚未提交的数据,然后事务B回滚了,因此事务A基于此数据做的操作都是无效的,就是读到了“脏”数据(实际上不应该存在的数据),所以叫脏读。

2、脏写或丢失更新(Lost Update)
第一类丢失更新:撤销rollback一个事务时,把其他事务已经提交更新的数据回滚掉了。
第二类丢失更新:提交commit一个事务时,把其他事务已经提交更新的数据覆盖掉了。

3、不可重复读(Non-Repeatable Reads)
在事务A中,按相同的条件执行查询过的sql,返回结果发生了修改或被删除了,这种现象就叫做“不可重复读”。

4、幻读(Phantom Reads)
在事务A中,按相同的条件执行查询过的sql,返回结果中有新数据(是其它事务插入的),就好像发生了幻觉一样,这就叫“幻读”。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改或删除,幻读侧重于新增。就这个结论网上很多博主写的是不可重复读侧重于修改,幻读侧重于新增或删除 (包括一些知名博主),大家请注意删除不属于幻读,我会在第四段演示时求证。另外后面我会单独安排一篇介绍MVCC机制,到时你自然会明白这里的原因。

三、事务4种隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

每种隔离级别可能出现的问题如下:

事务隔离级别 脏读 不可重复读 幻读
读未提交(RU) 可能 可能 可能
读已提交(RC) 不可能 可能 可能
可重复读(RR) 不可能 不可能 可能
串行化(Serializable) 不可能 不可能 不可能

1、读未提交(Read uncommitted,RU)

事务中的修改,即使没有提交,对其他事务也都是可见的,由于可能造成脏读,所以在实际应用中一般很少使用。

2、读已提交(Read committed,RC)

事务A修改并提交的数据才会对其它事务可见,所以解决脏读的问题。大多数数据库系统的默认隔离级别都是读已提交(像Oracle、PostgreSQL、SqlServer,但Mysql不是)。

3、可重复读(Repeatable read,RR)
Mysql默认的事务隔离级别。它保证了在同一个事务中多次读取相同记录的结果是一致的,所以解决了脏读和不可重复读问题,但未彻底解决幻读。

4、串行化(Serializable)

可串行化是最高的隔离级别。它通过强制事务串行执行,避免了前面所说的脏读,不可重复读和幻读问题。简单来说,可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。

四、Mysql演示4种隔离级别

在MySQL中,InnoDB引擎支持事务,MyISAM引擎不支持事务,所以本文实验的测试环境:Windows 10 + MySQL5.7 + InnoDB。
Mysql5.7可以通过命令select @@tx_isolation;语句来查看:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

设置4种隔离级别的命令:

set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';

开始事务:

begin;

提交事务:

commit;

回滚事务:

rollback;

1、读未提交(RU)

set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin;

验证脏读

2、读已提交(RC)

set tx_isolation='read-committed';
select @@tx_isolation;
begin;

验证解决脏读,存在不可重复读

验证幻读

3、可重复读(RR)

set tx_isolation='repeatable-read';
select @@tx_isolation;
begin;

验证解决脏读和不可重复读
上面说的不可重复读侧重于修改或删除,求证请看下面的截图,

验证幻读
Mysql的RR级别在一定程度上解决了幻读问题,但不够彻底,至于为什么这么说?还是那句话,得深入理解MVCC机制,这个会单独安排一篇,敬请期待!

4、串行化(Serializable)

set tx_isolation='serializable';
select @@tx_isolation;
begin;

如果长时间阻塞,最后会锁等待超时,抛出异常:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
换成是在事务A执行,结果也是一样会阻塞,直到其它事务完成或超时抛出同样的异常。
对于update也是同样的道理,详细如下图:

总结

通过本文我们已经详细说明了:

事务4大特性:ACID事务并发带来的4类问题:脏读、脏写、不可重复读、幻读事务的4种隔离级别:读未提交、读已提交、可重复读、串行化Mysql提供的4种隔离级别演示

剩下的MySQL锁机制和MVCC机制,我们下文见!

参考文章:

什么是事务?
三分钟图解事务隔离级别,看一遍就懂
MySQL事务隔离级别详解
MySQL的四种事务隔离级别
透彻解读mysql的可重复读、幻读及实现原理
【MySQL (三) | 五分钟搞清楚MySQL事务隔离级别】

到此这篇关于MySQL事务隔离机制的文章就介绍到这了,更多相关mysql事务隔离内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL查看和修改事务隔离级别的实例讲解

    查看事务隔离级别 在 MySQL 中,可以通过show variables like '%tx_isolation%'或select @@tx_isolation;语句来查看当前事务隔离级别. 查看当前事务隔离级别的 SQL 语句和运行结果如下: mysql> show variables like '%tx_isolation%'; +---------------+-----------------+ | Variable_name | Value | +---------------+--

  • 详解MySQL中事务隔离级别的实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别. 今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的实现原理. 当然MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正. 说明 MySQL的事务实现逻辑是位于引擎层的,并且不是所有的引擎都支持事务的,下面的说明都是以InnoDB引擎为基准.

  • MySQL系列之十 MySQL事务隔离实现并发控制

    目录 一.并发访问控制 二.事务Transactions 1.事务遵循ACID原则: 2.事务的生命周期 3.事务的隔离级别 4.死锁 一.并发访问控制 实现的并发访问的控制技术是基于锁: 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁:InnoDB支持表级锁和行级锁: 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读:写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作: 锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁: 锁策略:在锁

  • 浅析MySQL如何实现事务隔离

    一.前言 众所周知,MySQL的在RR隔离级别下查询数据,是可以保证数据不受其它事物影响,而在RC隔离级别下只要其它事物commit后,数据都会读到commit之后的数据,那么事物隔离的原理是什么?是通过什么实现的呢?那肯定是通过MVCC机制(Multi-Version Concurrency Control,即多版本并发控制). 注:MySQL的InnoDB引擎之所以能够支持高性能的并发性能,就是由于MySQL的MVCC机制(归功于undo log.Read-View.),但是本篇不对MVCC

  • Mysql事务隔离级别之读提交详解

    查看mysql 事务隔离级别 mysql> show variables like '%isolation%'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | READ-COMMITTED | +---------------+----------------+ 1 row in set (0.00 sec) 可以看到

  • mysql、oracle默认事务隔离级别的说明

    1.事务的特性(ACID) (1)原子性(Atomicity).事务中所涉及的程序对数据库的修改操作要么全部成功,要么全部失败. (2)一致性(Consistency).事务执行前和执行后来源和去向保持平衡. (3)隔离性(Isolation).并发时每个事务是隔离的,相互不影响. (4)持久性(Durubility).一旦事务成功提交,应该保证数据的完整存在. 2.事务隔离级别 (1)read uncommitted 未提交读 所有事务都可以看到没有提交事务的数据. (2)read commi

  • MySQL 四种事务隔离级别详解及对比

    MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别. 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-CO

  • MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位. 2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 .比如A向B转账,不可能A扣了钱,

  • MySql学习笔记之事务隔离级别详解

    背景 说的事务,大家应该都不陌生,开发用到 MySql 数据库的时候,通常会用到事务.其中比较经典的例子就是转账,比如你要给小明转 50 块钱,而此时你的银行卡也就只有 50 块钱. 对于转账过程在代码程序里会有一系列的操作,比如查询账户余额.余额加减.更新余额等,这些操作必须保证是一起处理的,不然等程序查完之后,如果账号 50 块钱还在,然后再给另外一个朋友转账,如果银行也处理的话,没有保证整个流程数据一致性的话,这不就乱套了吗?这时就要用到"事务"了. 事务介绍 简单来说,事务就是

  • innodb如何巧妙的实现事务隔离级别详解

    前言 之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实现事务的隔离特性中的4种隔离级别. 事务ACID特性,其中I代表隔离性(Isolation).隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离. 我们都知道事务的几种性质,数据库中的一致性和隔离性等是实现事务的基本思想,在系

  • MySQL数据库事务隔离级别详解

    数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读. Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别. Repeatable read:可以防止脏读和不可重复读. Serializable:可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率. 这四个级别可以逐个解决脏读 .不可重复读 .幻读 这几类问题. √: 可能出现 ×: 不会出现 事务级别 脏读 不可重复读 幻读 Read

  • mysql事务管理操作详解

    本文实例讲述了mysql事务管理操作.分享给大家供大家参考,具体如下: 本文内容: 什么是事务管理 事务管理操作 回滚点 默认的事务管理 首发日期:2018-04-18 什么是事务管理: 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱:在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱).

  • mysql数据库隔离级别详解

    目录 隔离级别 一.mysql有四个事务隔离级别 二.为什么默认RR隔离级别? 三.RR隔离级别下手动加锁解决幻读理论基础 脏读.不可重复读.幻读 及其解决方法 事务隔离级别命令行操作 操作验证 一.实现脏读 二.操作验证--实现不可重复读 三.操作验证--解决不可重复读 四.操作验证--实现幻读 总结 隔离级别 一.mysql有四个事务隔离级别 每个级别都有字符或数字编号 读未提交 READ UNCOMMITTED | 0 : 存在脏读,不可重复度,幻读的问题. 读已提交 READ COMMI

  • 深入理解Mysql事务隔离级别与锁机制问题

    概述 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读.脏写.不可重复度和幻读.这些问题的本质都是数据库的多事务并发问题,为了解决事务并发问题,数据库设计了事务隔离机制.锁机制.MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题. 事务及其ACID属性 原子性:操作的不可分割: 一致性:数据的一致性: 隔离性:事务之间互不干扰: 持久性:数据的修改时永久的: 并发事务处理带来的问题 脏写:丢失更新,最后的更新覆盖了由其他事务所做的更

  • Spring 事务隔离与事务传播的详解与对比

    Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置:编程式就是用注解的方式写到代码里. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource. Tr

随机推荐

其他