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

Innodb的行锁锁了什么

InnoDB的行锁是通过给索引上的索引项加锁,来实现的。只有通过索引条件进行数据检索,InnoDB才能使用行级锁;否则,InnoDB将使用表锁(锁住索引的所有记录)

表锁:lock tables xx read / write;

意向锁共享锁(IS) & 意向锁排它锁(IX)

意向共享锁(IS)

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

意向排它锁(IX)

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

意义:当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能启动表锁

自增锁AUTO-INC Locks

针对自增列自增长的一个特殊的表级别锁

show variables like 'innodb_autoinc_lock_mode';

默认取值1,代表连续。事务提交ID将永久丢失

记录锁(record) & 间隙锁(gap) & 临键锁(next-key)

临键锁(next-key locks)InnoDB默认的行锁算法

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

间隙锁(gap locks)

锁住数据不存在的区间(左开右开);当sql执行按照索引进行数据的检索时,查询条件的数据不存在,这是sql语句加上的锁即为gap locks,锁住索引不存在的区间(左开右开)

gap locks只在RR(可重复读)事务隔离级别存在

记录锁(record locks)

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

利用锁解决脏读

利用锁解决不可重复读

利用锁解决幻读

死锁介绍

  • 多个并发事务(2个或者以上)
  • 每个事务都持有锁(或者是已经在等待锁);
  • 每个事务都需要再继续持有锁;
  • 事务之间产生加锁的循环等待,形成死锁

避免死锁解决方案

  1. 类似的业务逻辑以固定的顺序访问表和行
  2. 大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小
  3. 在同一个事务中,尽可能做到依次锁定所需要的所有资源,减少死锁概率
  4. 降低隔离级别,如果业务允许,将隔离级别调低也是较好的选择
  5. 为表添加合理的索引,可以看到如果不走索引将会为表的每一行记录添加上锁

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值