• Mysql的锁(Innodb)


    前言

    锁和事务是Innodb提供的重要特性,是对共享资源在并发情况下通过一定的隔离机制,达到对共享资源的有效利用。本文主要通过对加锁流程的一些介绍,对SQL进行分析,可以让我们在写每行SQL语句的过程中,有效的分析出加锁流程、加锁范围,避免不必要的加锁问题和出现问题时可以快速排查。

    并发的问题和事务隔离级别

    并发中,最大的问题就是对共享资源的使用,无论是操作系统、web服务、或是其他一些并发场景,都会遇到各种各样并发操作共享资源引起的问题。而在大部分的web服务中,共享资源的实例就是数据,因此,把控好每个数据库操作,就可以解决相当一部分的并发引起的数据问题。

    并发导致的问题

    这里先简单介绍一下在并发情况下会发生的一些数据问题:

    • 脏读:读到了一个事务没有提交的操作
    • 不可重复读:同一个事务中两次读结果不一致
    • 幻读:第一个事务对一个范围进行了修改,第二个事务进行了插入的操作,导致第一个事务提交后发现还有未修改的行。

    事务隔离级别

    innodb通过提供事务隔离级别,让用户可以在性能和避免这些问题中做出取舍。从上至下,隔离级别升高,性能变差,相应的,数据问题也在变少。

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    读已提交(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

    Innodb的锁

    而实现事务的隔离机制的原理就是锁了,而锁也是解决各种并发问题的一把双刃剑,用好了问题迎刃而解,用不好还会引发各种问题。想要用好mysql的锁,了解如何加锁就至关重要了。

    锁的划分

    粒度划分

    • 行锁:Record Lock(给单条记录加锁)、Gap Lock(给两条记录的间隙加锁)、Next-Key Lock(左开右闭的区间)
    • 表锁
    • 页面锁

    级别划分

    • 读锁(Share Locks,S锁)
    • 写锁(Exclusive Locks,简称X锁)
    • 意向读锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁
    • 意向写锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁
    是否兼容 X IX S IS
    X 冲突 冲突 冲突 冲突
    IX 冲突 兼容 冲突 兼容
    S 冲突 冲突 兼容 兼容
    IS 冲突 兼容 兼容 兼容

    加锁流程

    • 加锁的基本单位是 next-key lock,锁是加在索引上的
    • 查找过程中,访问到的对象才会加锁
    • 索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁
    • 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁
    • 唯一索引上的范围查询会访问到不满足条件的第一个值为止。
  • 相关阅读:
    python全栈-Day 4
    5个步骤实现软件质量的快速提升
    如何选择正确的静态应用安全测试(SAST)解决方案?
    安全工具箱必备技术之静态分析安全测试(SAST)
    精彩回顾:2020年自动化软件测试质量峰会
    怎样才能明智地利用代码覆盖率来最大限度地提高测试效率?
    软件开发你不可不知的那些事:如何有效减轻风险和质量债务?
    敏捷开发中不为人知的小秘密,你是否深有同感?
    当AI遇上API测试 — 敏捷开发已迎来革新时代!
    面对行业分析家和敏捷专家都认可的API测试,我们为什么会望而却步?
  • 原文地址:https://www.cnblogs.com/enhe/p/12141685.html
Copyright © 2020-2023  润新知