Mysql总结 - InnoDB的七种锁

1.InnoDB锁的类型

总的来说,InnoDB共有七种类型的锁

  1. 共享/排它锁(Shared and Exclusive Locks)
  2. 意向锁(Intention Locks)
  3. 记录锁(Record Locks)
  4. 间隙锁(Gap Locks)
  5. 临键锁(Next-key Locks)
  6. 插入意向锁(Insert Intention Locks)
  7. 自增锁(Auto-inc Locks)

2.共享/排他锁(Shared and Exclusive Locks)

2.1共享锁S(读锁)

如果一个事物对一个对象加共享锁   那么  其他事物可以读并行 各自对该对象继续加共享锁  但是所有对象都不能做写操作(多个事务可以拿到一把S锁,读读可以并行)

2.2排它锁X(写锁)

一个事物对一个对象加排他锁   只有自己能读写   其他事物无法加锁也无法读写(而只有一个事务可以拿到X锁,写写/读写必须互斥)

3.自增锁(Auto-inc Locks)

自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

画外音:官网是这么说的

An AUTO-INC lock is a special table-level lock taken by transactions inserting into tables with AUTO_INCREMENT columns. In the simplest case, if one transaction is inserting values into the table, any other transactions must wait to do their own inserts into that table, so that rows inserted by the first transaction receive consecutive primary key values.

与此同时,InnoDB提供了innodb_autoinc_lock_mode配置,可以调节与改变该锁的模式与行为。

 

4.意向锁(Intention Locks)

意向锁得到粒度是表锁,分为意向共享锁(IS) 和 意向排它锁(IX) ,意向锁主要是为了方便的检测锁之间的冲突

5.插入意向锁(Insert Intention Locks)

对已有数据行的修改与删除,必须加强互斥锁X锁,那对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。插入意向锁,是间隙锁(Gap Locks)的一种(所以,也是实施在索引上的),它是专门针对insert操作的。

6.记录锁(Record Locks)

select * from t where index_col=1 for update;

当id为索引时    index_col=1索引下的记录会被加锁

7.间隙锁(Gap Locks)

间隙锁,它封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围

select * from t  where index_col between 8 and 15  for update;

index_col为索性时  会锁住8-15之间    不可插入索引为8-15之间的数据防止插入/修改

8.临键锁(Next-Key Locks)

临键锁,是记录锁与间隙锁的组合 临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值