专栏首页用户7890857的专栏mysql事务隔离级别
原创

mysql事务隔离级别

1、并发事务带来的问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。

不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复读和幻读区别:

不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了

2、事务隔离级别有哪些?MySQL的默认隔离级别是?

为了解决事务隔离性的问题,数据库一般会有不同的隔离级别来解决相应的读写影响。

SQL 标准定义了四个隔离级别:

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

需要注意的是,这是标准事务隔离级别下的定义。在innodb存储引擎中,在可重复读隔离级别下,通过next-key lock 解决了幻读的问题。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql 事务隔离级别

    1. MySQL事务隔离级别, 默认是可重复读(repeatable-read)

    北漂的我
  • Mysql事务隔离级别

    在所有事物中可以看到事物没有提交的结果,实际应用中是很少的,他的性能也不比其他隔离级别好很多,读到未提交的结果导致脏读

    小土豆Yuki
  • mysql事务隔离级别

    1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

    Java帮帮
  • MySQL事务隔离级别详解

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

    wangxl
  • MySQL事务隔离级别和MVCC

    MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)...

    南风
  • 面试题-Mysql事务隔离级别

    Mysql有四种隔离级别,这些隔离级别用来限定哪些是可见的,哪些是不可见的,隔离级别越低并发越高,Mysql中默认的隔离级别是可重复读,下面我们来一一介绍下这四...

    别明天就今天吧
  • 快速理解 MySQL 事务隔离级别

    在这个例子中根本不存在 id 为 1,并且 age 为 21 的记录,事务1读到了脏数据。

    dys
  • 一文搞懂mysql事务隔离级别

    这个是面试必问了吧….虽然目前在实际工作种我基本上还没有过实际的应用,但是在学习MySQL的时候还是专门进行一些学习,这里做一点记录.

    呼延十
  • 循序渐进 MySQL 事务隔离级别

    事务简言之就是一组 SQL 执行要么全部成功,要么全部失败。MYSQL 的事务在存储引擎层实现。

    波罗学
  • mysql 事务隔离级别如何选择

    数据丢失,两个事务同时进行,一个成功一个失败,造成数据回滚,或者两个都成功造成数据覆盖

    海涛
  • 在?MySQL事务隔离级别了解一下?

    事务的四大ACID 属性:Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性。

    编程大道
  • MySQL事务隔离级别的实现原理

    在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。

    allsmallpig
  • mysql事务隔离级别详解和实战

    设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别,例如~

    sunsky
  • 记一次mysql事务隔离级别踩坑

    同样的条件 ,   第 1 次和第 2 次读出来的记录数(强调的是记录数,而不是记录本身,因为读锁的锁粒度是记录自身,而不是整张表)不一样。

    mariolu
  • 五分钟搞清楚MySQL事务隔离级别

    好久没碰数据库了,只是想起自己当时在搞数据库的时候在事务隔离级别这块老是卡,似懂非懂的。现在想把这块整理出来,尽量用最简洁的语言描述出来,供新人参考。

    java思维导图
  • 五分钟搞清楚MySQL事务隔离级别

    首先创建一个表 account。创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB)。表的结构如下:

    哲洛不闹
  • MySQL事务隔离级别和Spring事务关系介绍

    接下来一次来验证每个隔离级别的特性,首先我们先建一张表,我们建立账户表account用来测试我们的事务隔离级别:

    用户1655470
  • MySQL事务隔离级别和Spring事务关系介绍

    接下来一次来验证每个隔离级别的特性,首先我们先建一张表,我们建立账户表account用来测试我们的事务隔离级别:

    lyb-geek
  • 惊!MySQL事务隔离级别原来这么简单

    数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的重要特征之一。

    黑洞代码

扫码关注云+社区

领取腾讯云代金券