zoukankan      html  css  js  c++  java
  • 5.7-mysql不同隔离级别下执行sql的上锁情况-building

    READ-COMMITTED级别

    update where 条件为(聚簇索引 或者 普通索引 或者 非索引字段)

    只会对加锁,此时没有gap锁(从information_schema.innodb_locks里查找锁信息时,显示的lock type是record)。即使where后面是范围条件也只对存在的行加锁。根源上是锁聚簇索引(主键)。

    REPEATABLE READ级别

    update where 条件为 非索引字段

    因为此隔离级别存在gap锁,将会对全表上next-key锁。全表上锁,在所有主键上加锁,同时在所有主键的间隙中加锁!再强调一遍。

    update where 非索引字段='表中不存在的值'

    也会导致全表上next-key锁。

    但是如果条件是主键字段又会发生什么呢?

     update where 主键 = ?

    只会对符合条件的行加锁。没有gap。那执行不等于呢?

    update where 主键 !=

    恭喜,没有任何数据被锁。

    update where 主键 范围条件

    此种情况下,也只对符合条件的主键和间隙加锁。

    如果是非索引字段和普通索引字段或者唯一索引字段呢?我以后慢慢补全吧,生产环境一般都是READ-COMMITTED级别吧。

    总结:在rr级别下要小心。

  • 相关阅读:
    P1312 [NOIP2011 提高组] Mayan 游戏
    Codeforces Round 736
    CF487E Tourists
    荏苒
    数论
    [NOI2009] 二叉查找树 题解
    元素
    线性基
    杂录
    SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
  • 原文地址:https://www.cnblogs.com/coolgame/p/12118736.html
Copyright © 2011-2022 走看看