MySQL中的锁

Posted danaohu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的锁相关的知识,希望对你有一定的参考价值。

宏观

数据库锁

  • 粒度小,方便用于集群环境

代码锁

  • 粒度略大,需要封装

微观(数据库锁)

分类

行锁&表锁

只有明确指定主键,才会执行行锁,否则执行表锁

  • 无锁

    select * from user where id = -1 for update;		
    #主键不存在
    
  • 行锁

    select * from user where id = 1 for update;
    select * from user where id = 1 and name = \'kk\' for update;
    
  • 表锁

    #主键不明确
    select * from user where name = \'kk\' for update;
    select * from use where id <>3 for update;
    

锁算法(机制)

行锁算法

  • Record Lock(普通行锁)

    #主键值在条件范围内
    #记录存在
    
  • Gap Lock(间隙锁)

    #主键值不存在条件范围内,叫做间隙GAP,引擎就会对这个间隙加锁
    
  • Next-key Lock(行& 间隙锁)

    #主键值一部分在条件范围内
    #比如user表id字段自增共50条数据
    select * from user where id >49;		
    

表锁算法

  • 意向锁(升级机制)

    #当一个事务,带着表锁去访问被加了行锁的资源,此时,这个行锁就会升级为意向锁,将表锁住。
    #Session A
    select * from user where id = 1 for update ;
    #Session B
    select * from user where name like \'kkk%\' for update;
    那么Session A 就会升级成意向锁
    
  • 自增锁

    #事务插入自增类型的列时,获取自增锁。
    #如果一个事务正在往表中插入自增记录,其他事务都必须等待。
    

实现

共享锁 & 排他锁

行锁和表锁是粒度的概念,共享锁和排他锁是他们的具体实现。

共享锁(S)

允许一个事务去读一行,阻止其他事务去获取该行的排他锁。

select lock in share mode

排他锁(X):写锁

允许持有排它锁事务读写数据,阻止其他事务获取该资源的共享锁和排它锁

select for update\\insert\\delete

多并发版本控制MVCC

加锁是当前读,保证读取的是最新的数据;在隔离级别为REPEATABLE时,不加锁的select操作是快照读,有可能读到的不是最新的版本。ps:在串行级别下,快照读会退化成当前读。

以上是关于MySQL中的锁的主要内容,如果未能解决你的问题,请参考以下文章

硬核!管理mysql数据库的工具

Mysql中的锁

MySQL中的锁

Mysql中的锁

mysql中的锁

MySQL中的锁