美文网首页
Innodb锁(一)

Innodb锁(一)

作者: TTTing听 | 来源:发表于2019-07-30 22:04 被阅读0次

共享和排他锁(shard and Exclusive Locks)

Innodb 支持标准的行级共享和排他锁。

共享锁:允许多个事务同时持有同一行的共享锁,阻止其他事物持有其排他锁

排他锁:阻止其他事务持有共享锁和排他锁


CREATE TABLE `t` (

  `id` int(11) NOT NULL,

  `c` int(11) DEFAULT NULL,

  `d` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `c` (`c`)

) ENGINE=InnoDB;

insert into t values(0,0,0),(5,5,5),

(10,10,10),(15,15,15),(20,20,20),(25,25,25);

执行上面脚本,该表将作为后面示例表

示例

排他锁阻止其他事务获得锁
session 1 session 2 Time
select * from t where t.id = 0 for update T1
select * from t where t.id = 0 lock in share mode(block) T2

---TRANSACTION 2049725, ACTIVE 3 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)

MySQL thread id 1354, OS thread handle 0x7000049a5000, query id 4451 localhost root statistics

select * from t where id = 0 lock in share mode

------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 1083 page no 3 n bits 80 index `PRIMARY` of table `test`.`t` trx id 2049725 lock mode S locks rec but not gap waiting

输入innodb status后发现,2049725正等待获得共享锁

共享锁
Session1 session2 Session3 Time
select * from t where t.id = 0 lock in share mode T1
select * from t where t.id = 0 lock in share mode(no block) T2
select * from t where t.id = 0 for update(block) T3

共享锁会阻止其他事务获取排他锁,但是不会阻止其他事务获得共享锁

意向锁(Intention Locks)

意向锁是innodb为了支持多种粒度的锁而引入的。意向锁也分为两种
共享意向锁一个事务获取行共享锁之前需要先申请表的共享意向锁
排他意向锁一个事务获取行排他锁之前需要先申请表的排他意向锁
意向锁最主要的目的是表明有事务正锁定了一行或将要锁定一行

表级别锁兼容

79050747.png
如上图可以看出表级别意向锁不论排他还是共享都是互相兼容的。意向锁不会阻塞任何事务,除了锁表请求(Lock tables writes)

示例

排他意向锁

select * from t where t.id = 0 for update


---TRANSACTION 2049731, ACTIVE 4 sec

2 lock struct(s), heap size 360, 1 row lock(s)

MySQL thread id 1357, OS thread handle 0x700004b3d000, query id 4479 localhost root

TABLE LOCK table `test`.`t` trx id 2049731 lock mode IX

RECORD LOCKS space id 1083 page no 3 n bits 80 index `PRIMARY` of table `test`.`t` trx id 2049731 lock_mode X locks rec but not gap

从内核状态可以看出对id=0这行除了申请了行级别排他锁外,还申请了表级别的排他意向锁(IX)

排他意向锁阻塞
session 1 session 2 Time
select * from t where t.id = 0 lock in share mode T1
lock table t writes(block) T2

lock信息输出设置

set global innodb_status_output_locks=ON;
set global innodb_status_output=ON

Refereneces

相关文章

  • MySQL技术内幕InnoDB存储引擎阅读相关笔记-锁

    一、InnoDB锁 对于MyISAM引擎来说,其锁是表锁。InnoDB引擎提供行锁。 1、InnoDB行锁 1)、...

  • 校招面试题mysql锁总结

    目录 锁定义 锁分类 读锁和写锁 表锁和行锁 InnoDB共享锁和排他锁 InnoDB意向锁和排他锁 InnoDB...

  • 阿里P8大佬带你全面了解—MySQL锁:03.InnoDB行锁

    目录 InnoDB 行锁锁排查可以用的视图和数据字典InnoDB 行锁兼容性 InnoDB行锁之共享锁共享锁: 查...

  • [译]Innodb中的锁

    原文地址InnoDB Locking 本章节描述了InnoDB中使用的锁. 共享锁和排它锁 意向锁 记录锁 间隙锁...

  • SQL语句加了哪些锁?

    InnoDB的锁 InnoDB 三种行锁: Record Lock(记录锁):锁住某一行记录 Gap Lock(间...

  • Mysql中的锁

    锁的类型有哪些 基于锁的属性分类:共享锁、排他锁。 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB...

  • InnoDB行锁

    十、 InnoDB行锁0、 查看方式1、 共享锁2、 排他锁3、 意向锁4、行锁案列5、InnoDB锁实现 0、 ...

  • 文章总结(6)—数据库

    InnoDB和MyISAM存储引擎的区别 InnoDB使用的是行锁,MyISAM使用的是表锁; InnoDB支持事...

  • MySQL-InnoDB行锁

    InnoDB的锁类型 InnoDB存储引擎支持行锁,锁类型有两种: 共享锁(S锁) 排他锁(X锁) S和S不互斥,...

  • 淘宝MySQL文档整理

    MySQL · 引擎特性 · InnoDB 事务锁系统简介 MySQL · 引擎特性 · Innodb 锁子系统浅...

网友评论

      本文标题:Innodb锁(一)

      本文链接:https://www.haomeiwen.com/subject/izgorctx.html