欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL中锁的详解

程序员文章站 2022-06-02 12:18:18
...

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。


MySQL中锁粒度对比,表锁和行锁的区别:

  • 锁定粒度:表锁 > 行锁
  • 加锁效率:表锁 > 行锁
  • 冲突概率:表锁 > 行锁
  • 并发性能:表锁 < 行锁

MyISAM和InnoDB分别支持什么粒度的锁?

MyISAM支持表锁,同时也支持列所,表锁加锁方式:

lock tables 表名 read;
lock tables 表名 write;
unlock tables;

锁的细分

锁名 锁级别 英文名称
共享锁 行锁 Shared Locks
排它锁 行锁 Exclusive Locks
意向共享锁 表锁 Intention Shared Locks
意向排它锁 表锁 Intention Exclusive Locks

共享锁

又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一个数据可以共享一把锁,都能访问到数据,但是只能读不能修改;

  • 加锁方式
select * from table where id = 1 Lock IN SHARE MODE;

释放锁:当前你事务结束,或者当前连接断开,都会释放当前锁,不管当前数据是否commit/rollback

排它锁

又称为写锁,简称为X锁,排它锁不能与其他锁并存,如果一个事务获取了一个数据行的排它锁,其他事务就不能再获取该锁,只有该获取了排它锁的事务是可以对数据行进行读取和修改。

  • 加锁方式:
    自动:delete / update / insert 默认加上X锁
    手动:select * from table for update

意向锁

意向锁是由数据引擎自己维护的,用户无法手动操作意向锁

  • 意向共享锁(Intention Shared Lock,简称IS锁)。表示事务准备给数据行加入共享锁,也就是一个数据行加共享锁前必须先取得该表的IS锁
  • 意向排它锁(Intention Exclusive Lock,简称IX锁)表示事务准备给数据行加入排它锁,说明事务在一个数据行加排它锁前必须先获得该表的IX锁。

为什么需要表级别的意向锁?假设没有意向锁,我们加表锁的时候,需要去扫描全表是否有存在锁,数据量过大的时候,会导致加锁效率很低。但是如果我们在加锁的时候,数据库给我们自动加上意向锁,标记当前表,某个地方已经有了锁,那么我们就可以以很低的消耗,来完成是否加锁这个动作

MySQL中的锁和Java中的锁的作用相同吗?

这两个种类的锁的作用都是一样的,都是为了解决资源并发的情况下,对资源的写问题的控制。简单来说就是解决并发。

MySQL中锁的本质是什么?

在MySQL数据库中,锁的本质就是对索引打上标记,如果当前表没有索引,则直接找到sequence/rownum这样的默认表序列,完成锁表。