美文网首页
再说事务隔离级别

再说事务隔离级别

作者: packet | 来源:发表于2019-02-27 20:49 被阅读0次

一直以为数据库的东西懂得不少,知道今天在脉脉看到一道面试题:mysql / innodb RR级别,如果多个事务执行 update table set a = a - 1 where a > 0,那么会导致a小于0吗?
我一开始认为是会的。
T1: select a from table; // 发现a = 1
T2: update table set a = a - 1 where a > 0并提交,这时a = 0
T1: select a from table; // 发现a = 1
T1: update table set a = a - 1 where a > 0, 执行完毕a = -1
这种逻辑的漏洞有是:RR级别,select读的是快照,不需要加锁,读到的数据未必是真实的数据。而update则是基于真实的数据操作的,而且必须要加锁。所以第四个语句,会影响零行。

MySQL在RR级别下,会有幻读操吗?
首先需要清除幻读的定义,这跟我以前的认识是不一样的。

幻读错误的理解:说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 11 条记录。这其实并不是幻读,这是不可重复读的一种,只会在 R-U R-C 级别下出现,而在 mysql 默认的 RR 隔离级别是不会出现的。
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

其实 RR 也是可以避免幻读的,通过对 select 操作手动加 行X锁(SELECT ... FOR UPDATE 这也正是 SERIALIZABLE 隔离级别下会隐式为你做的事情),同时还需要知道,即便当前记录不存在,比如 id = 1 是不存在的,当前事务也会获得一把记录锁(因为InnoDB的行锁锁定的是索引,故记录实体存在与否没关系,存在就加 行X锁,不存在就加 next-key lock间隙X锁),其他事务则无法插入此索引的记录,故杜绝了幻读。

参考: mysql 幻读的详解、实例及解决办法

相关文章

  • 再说事务隔离级别

    一直以为数据库的东西懂得不少,知道今天在脉脉看到一道面试题:mysql / innodb RR级别,如果多个事务执...

  • Spring 中的事务隔离级别

    什么是事务隔离级别? 事务隔离级别是对事务 4 大特性中隔离性的具体体现,使用事务隔离级别可以控制并发事务在同时执...

  • MySQL_tx_isolation

    事务隔离级别 一、数据库事务隔离级别数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、...

  • MySQL事务隔离级别和实现原理,看这一篇就够了!!!

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么...

  • 面试题

    基础知识 1、事务隔离级别 补充: 1、事务隔离级别为读提交时,写数据只会锁住相应的行 2、事务隔离级别为可重复读...

  • 数据库事务相关

    事务隔离级别(tx_isolation)mysql 有四级事务隔离级别 每个级别都有字符或数字编号 级别symbo...

  • 关于Spring的事务Transactional,锁同步,并发线

    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。...

  • Mysql事务

    事务隔离级别 事务隔离级别有四种:read-uncomitted,read-commited,repeatable...

  • mysql事务-2020-11-21

    use test查询事务隔离级别:select @@tx_isolation; 设置事务隔离级别://全局的set...

  • MYSQL事务

    常用语句 MYSQL事务,锁表 事务控制语句 事务的隔离级别 隔离级别描述产生风险READUNCOMMITTED ...

网友评论

      本文标题:再说事务隔离级别

      本文链接:https://www.haomeiwen.com/subject/zmrquqtx.html