mysql锁的介绍

一、理解表锁、行锁

锁是用于管理不同时事务对共享资源的访问

表锁与行碎的区别:

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

InnoDB存储引擎支持行锁和表锁,表锁就是就把所有的行锁起来

二、Mysql InnoDB 锁的类型

  • 共享锁(行锁): Shared Locks
  • 排它锁(行锁): Exclusive Locks
  • 意向锁共享锁(表锁): intention Shared Locks
  • 意向锁排它锁(表锁): Intention Exclusive Locks
  • 自增锁: AUTO-INC Locks

行锁的算法

  • 记录锁 Record Locks
  • 间隙锁 Gap Locks
  • 临健锁 Next-key Locks
共享锁

共享锁又称读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问数据,但是只能读不能修改.
加锁释锁方式:
select * from users where id = 1 LOCK IN SHARE MODE
commit / rollback

排它锁

排它锁又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能再获取该行的碎(共享锁、排它锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改,(其他事务要读取数据可来自于快照)

加锁释锁方式:
delete / update / insert 默认加上X锁
select * from table_name where… For update
commit/rollback

意向锁共享锁(IS)

表示事务准备给数据行加入共享锁,即一个数据行加共享锁前必须先取得该表对IS锁,意向共享锁之间是可以相互兼容的

意向锁排它锁(IX)

表示事务准备给数据行加入排它锁,即一个数据行加排它锁前必须先取得该表的IX锁,意向排它锁之间是可以相互兼容的

意义:
当事务想去进行锁表时,可以先判读意向锁是否存在,存在时则可快递返回该表不能启用表锁(锁住索引的所有记录)

自增锁AUTO-INC Locks

针对自增列自增长的一个特殊的表级别锁
show VARIABLES like ‘innodb_autoinc_lock_mode’;
默认取值1,代表连续,事务微提交ID永久丢失

三、innodb-行锁到底锁了什么

Innodb的行锁是通过给索引上的索引项加锁来实现的.

只有通过索引条件进行数据检索,InnoDB才使用行级锁,否则,InnoDB将使用表锁(锁住索引的所有记录)

表锁: lock tables xx read/write;

四、行锁的算法

临健锁(Next-key)

当sql执行按照索引进行数据当检索时,查询条件为范围查询(between and < >等),并且有数据命中,则此时sql语句加入的锁为next-key locks,锁住索引的记录+区间(左开又闭)

当前数据库的数据有 id = 1 4 7 10 的4条数据
在这里插入图片描述

间隙锁(Gap)

当sql执行按照索引进行数据检索时,查询当数据不存在,这是SQL语句加入当锁即为Gap locks,锁住索引不存在的区间(左开右开)
在测试中,范围查询, 右是闭的
在这里插入图片描述

记录锁(Record)

当sql执行按照唯一性(Primary key、Unique key)索引进行数据的检索时,查询条件等值匹配且查询的数据是存在,这时SQL语句加上的锁即为记录锁record locks,锁住具体的索引项

在这里插入图片描述

利用锁解决脏读

在这里插入图片描述
事务B修改数据时,加上了x锁,A事务就不能读取数据了(实际上是读取了快照数据)

利用锁解决不可重复读

在这里插入图片描述
事务A读取数据时,加上S锁,事务B不能修改该数据.

利用锁解决幻读

在这里插入图片描述
当事务A使用范围查询时,会使用临界锁锁住数据.事务B不能插入数据.当时范围查询是时,并不能解决幻读问题,mysql 是通过锁和mvcc来解决幻读的

为什么会产生死锁

多个并发事务(2个或者以上),每个事务都持有锁,同时每个事务又在竞争各自都锁,事务之间产生加锁的循环等待,形成死锁.

避免死锁

  1. 类似的业务逻辑以固定的顺序访问表和行
  2. 大事务拆小事务,大事务更倾向于死锁,如果业务允许,将大事务拆小
  3. 在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率
  4. 为表添加合理的索引,可以看到如果不走索引将会为表的每一行记录添加上锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值