• mysql中delete from t1 where id = 10加锁状况叙述


    Next_Key Lock算法中,不仅仅锁定住所找到的索引,而且还锁定住这些索引覆盖的范围。因此在这个范围内的插入都是不允许的。这样就避免了在这个范围内插入数据导致的幻读问题。

    delete from t1 where id = 10;

    组合一id列是主键,RC隔离级别

    id = 10的记录加上X.

    组合二:id列是二级唯一索引,RC隔离级别

    id列是unique列,其上有unique索引。那么SQL需要加两个X锁,一个对应于id unique索引上的id = 10的记录,另一把锁对应于聚簇索引上的[name=’*,id=10]的记录。

    组合三:id列是二级非唯一索引,RC隔离级别

    id列索引上,满足id = 10查询条件的记录,均已加锁。同时,这些记录对应的主键索引上的记录也都加上了锁。与组合二唯一的区别在于,组合二最多只有一个满足等值查询的记录,而组合三会将所有满足查询条件的记录都加锁。

    组合四:id列上没有索引,RC隔离级别

    id列上没有索引,SQL会走聚簇索引的全扫描进行过滤,由于过滤是由MySQL Server层面进行的。因此每条记录,无论是否满足条件,都会被加上X锁。

    组合五:id列是主键,RR隔离级别

    与组合一相同

    组合六:id列是二级唯一索引,RR隔离级别

    与组合五类似,组合六的加锁,与组合二:[id唯一索引,Read Committed]一致。两个X锁,id唯一索引满足条件的记录上一个,对应的聚簇索引上的记录一个。

    组合七:id列是二级非唯一索引,RR隔离级别, 结果如下图:

    其实这个多出来的GAP锁,就是RR隔离级别,相对于RC隔离级别,不会出现幻读的关键。确实,GAP锁锁住的位置,也不是记录本身,而是两条记录之间的GAP

  • 相关阅读:
    近似计算π(for循环)
    apache部署mo_python
    文件注释方法
    算法效率的度量
    ssh
    使用类名创建对象
    筛选网址
    常用django命令
    查看和关闭端口
    update脚本出错
  • 原文地址:https://www.cnblogs.com/lbg-database/p/9835182.html
Copyright © 2020-2023  润新知