Mysql锁

Mysql锁及使用场景

问题提出

收到 DBA 发出的慢 SQL 报警邮件,如下:

UPDATE order_exception_042 SET yn = 0 WHERE order_id = 1050020097947451;
# Query_time: 0.101579 Lock_time: 0.000039 Rows_sent: 0 Rows_examined: 8420
SET timestamp=1590108934;

根据报警邮件可以看到,查询时间较长的原因是检索的行数过多导致的(order_id没有索引,因此全表查询),其中的 lock_time 引起了我的注意,update 语句会锁表吗?是行级锁还是表级锁呢?

读完本文你将收获

  1. 常见的SQL会触发哪些锁
  2. 如何在本地练习具体执行的SQL触发了哪些锁(查看锁日志)
  3. 为什么 update 语句最好使用 主键来更新
  4. MySQL中的锁类型和锁模式

Mysql中锁的分类(Lock Type)

  1. Shared and Exclusive Locks

    行级锁。这两个分别是最为普通的读锁和写锁。读锁,又称为 S 锁,允许多个事务同时获取,因此也叫共享锁。写锁,又称为 X 锁,一次只能被同一个事务占有,因此也叫独占锁。

    为什么要区分出读锁和写锁呢?因此要提高数据库的并发性,如果只有一个锁,数据库一次只能被一个事务读取,而对于数据库而言超过 80% 的使用场景都是读取数据,因此并发性会大大的降低。

  2. Intention Locks

    表级锁。翻译过来叫做 “意向锁”,意向锁也分为读意向锁(Intention Shared Lock,简写为 IS)和写意向锁(Intention Exclusive Lock,简写为 IX)。在 Mysql 中,为了实现多粒度锁控制,引入了意向锁。

    当一个事务请求施加行级共享锁(Shared Locks)时,它必须先获取到表级读意向锁。如 select ... lock in share mode 先获取到了读意向锁,然后对行施加读锁。

    当一个事务请求施加行级独占锁(Exclusive Locks)时,它必须先获取到表级写意向锁。如 select ... for update 先获取到写意向锁,然后对表中的行施加写锁。

    通过上面的例子我们还得知:表级锁和行级锁是可以共存的。表级锁的兼容性见下表:

X S IX IS
X
S
IX
IS
  1. Record Locks

    行级锁。只针对索引有效。如 select field1 from t1 where id = 1 for update ,执行该语句时就会把 id=1 的所有行锁住,防止其他事务对 id=1 的行进行删除,增加,修改操作。

  2. Gap Locks

    行级锁。俗称 “间隙锁”。间隙锁施加的对象是两个 index records 之间的间隙。如 select filed1 from t1 where field1 between 10 and 20 for update,执行该语句时,Mysql 施加的间隙锁会防止 field1=15 的记录插入,因为 15 位于 10 和 20 的间隙。

    Mysql 采用间隙锁的做法防止了 “幻影行” 的出现。关闭间隙锁的做法就是调整 Mysql 的事务隔离级别,从默认的 RR 调整为 RC

  3. Next-Key Locks

    行级锁。当 Mysql 事务的隔离级别为 RR(Repeatable Read)时,Next-Key Lock 使用的频率最为频繁,因为 Next-Key Lock 可以理解为 Record Lock + Gap Lock. MySQL 中引入 Next-Key Lock 锁的原因同样是为了解决幻影行的出现。

MySQL中锁的模式(Lock Mode)

Mysql 中总共只有四种锁的模式, 表级锁有 4 种(X , S, IX, IS),行级锁只有两种(X , S), 表级锁的兼容性如下表

X S IX IS
X
S
IX
IS
  1. X: 与其他任何锁冲突
  2. S : 与X锁,IX 锁冲突,允许并发读
  3. IX : 意向锁和意向锁之间不冲突,意味着 Mysql 支持单表的并发的读写
  4. IS: 意向锁和意向锁之间不冲突,意味着 Mysql 支持单标并发的读写

如何触发?

  1. X

    使用下列语句触发锁 locking 表,此时不允许任何请求读

    lock tables locking write;
    
  2. S

    使用下拉语句触发锁 locking 表,此时不允许任何请求写

    lock tables locking read;
    
  3. IX

    DML 语句,如 delete, update, insert 操作都会触发 Mysql 对表施加 IX 锁。

    select ... for update

  4. IS

    select ... lock in share mode;

最为普通的 select 语句会加锁吗?

不会,select 语句使用读快照的方式,保证了 MySQL 的高并发特性。读快照不涉及到加锁和解锁。

Mysql开启锁监控

set GLOABL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

查看锁的状态

show engine innodb status\G

实战

特殊符号说明:

  • ^ 用来表示间隙锁,如间隙锁的区间为 15-18, 则表示为 15^18
  • + 用来表示Next-key锁,如Next-key锁由15-18的间隙锁和18的Record行锁构成,表示为15^18+18

如何根据日志辨别是哪种行锁?

--Record Lock
RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71483 lock_mode X locks rec but not gap
--Gap Lock
RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71486 lock_mode X locks gap before rec
--Next-key Lock
RECORD LOCKS space id 782 page no 5 n bits 80 index idx_name of table `ele`.`locking` trx id 71497 lock_mode X

使用ele库,隔离级别为RR(Repeatable Read),表结构如下

CREATE TABLE `locking` (
  `id` int(11) NOT NULL,
  `no` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_no` (`no`) USING BTREE,
  KEY `idx_name` (`name`) USING BTREE,
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中初始数据如下:

Screenshot 2020-05-24 at 12.18.35 PM.png

确保开启了 Mysql 的锁监控

set GLOABL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

下面我们开始测试各个场景下 Mysql 会施加哪种级别哪种类型的锁

  1. 聚簇索引,查询命中
session1 session2 备注
begin;
update locking set score = 99 where id = 15; begin;
select * from locking where id =15
commit;
select * from locking where id = 15 此时score=100,因为隔离级别为RR,确保在同一个事务中,同一个SQL查询的结果是一致的

此时我们查看锁的施加情况

show engine innodb status\G

展示如下

 ------------
 TRANSACTIONS
 ------------
 2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
 MySQL thread id 6, OS thread handle 123145511911424, query id 150 localhost root starting
 show engine innodb status
 --ID为71483的事务对ele库的locking表施加了 IX 写意向锁
 TABLE LOCK table `ele`.`locking` trx id 71483 lock mode IX
 --ID为71483的事务对ele库的locking表中的主键索引施加了 X 写锁,特别指明没有 gap 间隙锁
 RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71483 lock_mode X locks rec but not gap
 Record lock, heap no 2 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
  0: len 4; hex 8000000f; asc     ;;
  1: len 6; hex 00000001173b; asc      ;;;
  2: len 7; hex 30000001700d8a; asc 0   p  ;;
  3: len 5; hex 5330303031; asc S0001;;
  4: len 3; hex 426f62; asc Bob;;
  5: len 4; hex 80000019; asc     ;;
  6: len 4; hex 80000062; asc    b;;

在 Session1 执行事务时,已经获取了 locking 表的 写意向锁,并且对 id=15 这个聚簇索引施加了 X 写锁,但是此时 Session2 执行另外一个事务中的 select 语句,仍然能读到 id=15 的数据,这一点证明普通的 select 语句是读快照不用加锁的。

  1. 聚簇索引,查询未命中
session1 session2 备注
begin;
update locking set score = 80 where id = 16; begin;
select * from locking where id =16
commit;
select * from locking where id = 16
commit;
 ------------
 TRANSACTIONS
 ------------
 show engine innodb status
 --ID为71486的事务对ele库的locking表施加了 IX 写意向锁
 TABLE LOCK table `ele`.`locking` trx id 71486 lock mode IX
 --ID为71483的事务对ele库的locking表中的主键索引施加了 X 写锁,为间隙锁(15^18)
 RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71486 lock_mode X locks gap before rec
 Record lock, heap no 3 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
  0: len 4; hex 80000012; asc     ;;
  1: len 6; hex 000000011708; asc       ;;
  2: len 7; hex a8000001db0110; asc        ;;
  3: len 5; hex 5330303032; asc S0002;;
  4: len 5; hex 416c696365; asc Alice;;
  5: len 4; hex 80000018; asc     ;;
  6: len 4; hex 8000004d; asc    M;;
 --------
  1. 二级唯一索引,查询命中
session1 备注
begin;
update locking set score = 80 where no = 'S0002';
commit;
  ------------
  TRANSACTIONS
  ------------
  show engine innodb status
  --ID为71487的事务对ele库的locking表施加了 IX 写意向锁
  TABLE LOCK table `ele`.`locking` trx id 71487 lock mode IX
  --ID为71487的事务对ele库的locking表中的idx_no索引施加了 X 写锁,特别指明没有 gap 间隙锁
  RECORD LOCKS space id 782 page no 4 n bits 80 index idx_no of table `ele`.`locking` trx id 71487 lock_mode X locks rec but not gap
  Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
   0: len 5; hex 5330303032; asc S0002;;
   1: len 4; hex 80000012; asc     ;;
  --ID为71487的事务对ele库的locking表中的主键索引施加了 X 写锁,特别指明没有 gap 间隙锁
  RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71487 lock_mode X locks rec but not gap
  Record lock, heap no 3 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000012; asc     ;;
   1: len 6; hex 00000001173f; asc      ?;;
   2: len 7; hex 33000001572461; asc 3   W$a;;
   3: len 5; hex 5330303032; asc S0002;;
   4: len 5; hex 416c696365; asc Alice;;
   5: len 4; hex 80000018; asc     ;;
   6: len 4; hex 80000050; asc    P;;
  --------
  1. 二级唯一索引,查询未命中
session1 备注
begin;
update locking set score = 80 where = 'S0008';
commit;
  ------------
  TRANSACTIONS
  ------------
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 71496 lock mode IX
  --从日志看,对idx_no索引施加的Next-Key Lock,而非 Gap Lock 与https://zhuanlan.zhihu.com/p/67793185 这篇文章写的有出入
  RECORD LOCKS space id 782 page no 4 n bits 80 index idx_no of table `ele`.`locking` trx id 71496 lock_mode X
  Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
   0: len 8; hex 73757072656d756d; asc supremum;;
  --------
我们这里使用的唯一索引 idx_no 是类型为 varchar,字段名为 no 列,经过多次试验,varchar 类型的唯一如果没有命中施加的都是 Next-key Lock, 位置为 LastNode^Supremum+Supremum。

如果使用的唯一索引为非 varchar 类型,举例来说,我们在表中增加一个字段和唯一索引,SQL语句如下:

```sql
alter table locking add column no_id default null int(20)
alter table add unique idx_no_id (`no_id`)
```

此时,我们根据 no_id 唯一索引去查询,未命中的情况下,Mysql 施加的是 Gap Lock 或 Next-Key Lock,取决于 no_id 是否为索引的边界。

```sql
--no_id 落在索引边界
------------
TRANSACTIONS
------------
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 2, OS thread handle 123145405616128, query id 117 localhost root starting
show engine innodb status
TABLE LOCK table `ele`.`locking` trx id 72010 lock mode IX
--update locking set score where no_id = 12(12大于现有的所有no_id,为边界值,此时施加的是Next-Key Lock)
RECORD LOCKS space id 784 page no 7 n bits 80 index idx_no_id of table `ele`.`locking` trx id 72010 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;
--------

--no_id 落在两个索引之间
------------
TRANSACTIONS
------------
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 2, OS thread handle 123145405616128, query id 113 localhost root starting
show engine innodb status
TABLE LOCK table `ele`.`locking` trx id 72009 lock mode IX
--update locking set score where no_id = 8(8位于6和10之间,此时施加的是Gap Lock)
RECORD LOCKS space id 784 page no 7 n bits 80 index idx_no_id of table `ele`.`locking` trx id 72009 lock_mode X locks gap before rec
Record lock, heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 8000000a; asc     ;;
 1: len 4; hex 80000032; asc    2;;
--------
```
  1. 二级非唯一索引,查询命中
session1 备注
begin;
update locking set score = 80 where name = 'Tom';
commit;
  ------------
  TRANSACTIONS
  ------------
  --3种锁类型:Record Lock, Next-key Lock, Intention Lock
  --5个行锁:三个Next-key锁 Rose^Tom1+Tom1,Tom1^Tom2+Tom2,Tom2^Supermum+Supremum(这三个在idx_name索引上)
  --      两个Record锁:Tom1,Tom2(这两个在主键索引上)
  3 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 2
  MySQL thread id 6, OS thread handle 123145511911424, query id 227 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 71497 lock mode IX
  RECORD LOCKS space id 782 page no 5 n bits 80 index idx_name of table `ele`.`locking` trx id 71497 lock_mode X
  Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
   0: len 8; hex 73757072656d756d; asc supremum;;

  Record lock, heap no 6 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
   0: len 3; hex 546f6d; asc Tom;;
   1: len 4; hex 80000025; asc    %;;

  Record lock, heap no 7 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
   0: len 3; hex 546f6d; asc Tom;;
   1: len 4; hex 80000031; asc    1;;
  --在主键索引上施加的Record Lock,非Gap Lock
  RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71497 lock_mode X locks rec but not gap
  Record lock, heap no 6 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000025; asc    %;;
   1: len 6; hex 000000011749; asc      I;;
   2: len 7; hex 390000016c0dda; asc 9   l  ;;
   3: len 5; hex 5330303035; asc S0005;;
   4: len 3; hex 546f6d; asc Tom;;
   5: len 4; hex 80000016; asc     ;;
   6: len 4; hex 8000005a; asc    Z;;

  Record lock, heap no 7 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000031; asc    1;;
   1: len 6; hex 000000011749; asc      I;;
   2: len 7; hex 390000016c0dfc; asc 9   l  ;;
   3: len 5; hex 5330303036; asc S0006;;
   4: len 3; hex 546f6d; asc Tom;;
   5: len 4; hex 80000019; asc     ;;
   6: len 4; hex 8000005a; asc    Z;;
  --------
  1. 二级非唯一索引,查询未命中
session1 备注
begin;
update locking set score = 80 where name = 'John';
commit;
  ------------
  TRANSACTIONS
  ------------
  --两种锁类型:Intention Lock,Gap Lock
  --一个行锁:Gap Lock
  2 lock struct(s), heap size 1136, 1 row lock(s)
  MySQL thread id 6, OS thread handle 123145511911424, query id 232 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 71499 lock mode IX
  --Gap Lock info
  RECORD LOCKS space id 782 page no 5 n bits 80 index idx_name of table `ele`.`locking` trx id 71499 lock_mode X locks gap before rec
  Record lock, heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
   0: len 4; hex 526f7365; asc Rose;;
   1: len 4; hex 80000032; asc    2;;
  --------
  1. 无索引
session1 备注
begin;
update locking set score = 80 where score = 90;
commit;
  ------------
  TRANSACTIONS
  ------------
  --两种锁类型:Intention Lock, Next-key Lock
  --8个行锁:infimum^15+15, 15^18+18, 18^20+20, 20^30+30
  --        30^37+37, 37^49+49, 49^50+50, 50^Supremum+Supremum
  2 lock struct(s), heap size 1136, 8 row lock(s), undo log entries 2
  MySQL thread id 6, OS thread handle 123145511911424, query id 240 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 71500 lock mode IX
  RECORD LOCKS space id 782 page no 3 n bits 80 index PRIMARY of table `ele`.`locking` trx id 71500 lock_mode X
  Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
   0: len 8; hex 73757072656d756d; asc supremum;;

  Record lock, heap no 2 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 8000000f; asc     ;;
   1: len 6; hex 000000011740; asc      @;;
   2: len 7; hex 340000015b2c45; asc 4   [,E;;
   3: len 5; hex 5330303031; asc S0001;;
   4: len 3; hex 426f62; asc Bob;;
   5: len 4; hex 80000019; asc     ;;
   6: len 4; hex 80000002; asc     ;;

  Record lock, heap no 3 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000012; asc     ;;
   1: len 6; hex 00000001173f; asc      ?;;
   2: len 7; hex 33000001572461; asc 3   W$a;;
   3: len 5; hex 5330303032; asc S0002;;
   4: len 5; hex 416c696365; asc Alice;;
   5: len 4; hex 80000018; asc     ;;
   6: len 4; hex 80000050; asc    P;;

  Record lock, heap no 4 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000014; asc     ;;
   1: len 6; hex 00000001170d; asc       ;;
   2: len 7; hex ab000001f10110; asc        ;;
   3: len 5; hex 5330303033; asc S0003;;
   4: len 3; hex 4a696d; asc Jim;;
   5: len 4; hex 80000018; asc     ;;
   6: len 4; hex 80000005; asc     ;;

  Record lock, heap no 5 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 8000001e; asc     ;;
   1: len 6; hex 00000001170e; asc       ;;
   2: len 7; hex ac000001170110; asc        ;;
   3: len 5; hex 5330303034; asc S0004;;
   4: len 4; hex 45726963; asc Eric;;
   5: len 4; hex 80000017; asc     ;;
   6: len 4; hex 8000005b; asc    [;;

  Record lock, heap no 6 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000025; asc    %;;
   1: len 6; hex 00000001174c; asc      L;;
   2: len 7; hex 3b0000017f0110; asc ;      ;;
   3: len 5; hex 5330303035; asc S0005;;
   4: len 3; hex 546f6d; asc Tom;;
   5: len 4; hex 80000016; asc     ;;
   6: len 4; hex 80000014; asc     ;;

  Record lock, heap no 7 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000031; asc    1;;
   1: len 6; hex 00000001174c; asc      L;;
   2: len 7; hex 3b0000017f0132; asc ;     2;;
   3: len 5; hex 5330303036; asc S0006;;
   4: len 3; hex 546f6d; asc Tom;;
   5: len 4; hex 80000019; asc     ;;
   6: len 4; hex 80000014; asc     ;;

  Record lock, heap no 9 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
   0: len 4; hex 80000032; asc    2;;
   1: len 6; hex 000000011746; asc      F;;
   2: len 7; hex 370000017b0812; asc 7   {  ;;
   3: len 6; hex 533030303130; asc S00010;;
   4: len 4; hex 526f7365; asc Rose;;
   5: len 4; hex 80000017; asc     ;;
   6: len 4; hex 80000059; asc    Y;;
  --------
因此无索引情况下使用 update 语句会对全表中主索引施加 Next-Key 锁,相当于锁表。此时由于 X 锁和 X 锁互斥,会导致其他 Session 不能插入,删除和更新表。

因此更新语句一定要使用主键或者其他唯一索引限定锁定的行数,提供数据库的并发性,也可以避免产生死锁。
  1. 范围更新

    现在 locking 表中的数据如下

    Screenshot 2020-05-25 at 10.46.22 AM.png

如果我们执行如下语句,Mysql 会施加几种锁?每个种类对应几个锁呢?

  update locking set score where id >= 50;
  ------------
  TRANSACTIONS
  ------------
  --三种类型锁:Intention Lock, Record Lock, Next-Key Lock
  --Record Lock: 施加在 id=50 的索引上
  --Next-Key Lock: 50^60+60, 60^Supremum+Supremum
  3 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 2
  MySQL thread id 2, OS thread handle 123145405616128, query id 150 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 72019 lock mode IX
  RECORD LOCKS space id 784 page no 3 n bits 88 index PRIMARY of table `ele`.`locking` trx id 72019 lock_mode X locks rec but not gap
  Record lock, heap no 15 PHYSICAL RECORD: n_fields 8; compact format; info bits 0
   0: len 4; hex 80000032; asc    2;;
   1: len 6; hex 000000011953; asc      S;;
   2: len 7; hex 3f000001641bc7; asc ?   d  ;;
   3: len 6; hex 533030303130; asc S00010;;
   4: len 4; hex 526f7365; asc Rose;;
   5: len 4; hex 80000017; asc     ;;
   6: len 4; hex 80000032; asc    2;;
   7: len 4; hex 8000000a; asc     ;;

  RECORD LOCKS space id 784 page no 3 n bits 88 index PRIMARY of table `ele`.`locking` trx id 72019 lock_mode X
  Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
   0: len 8; hex 73757072656d756d; asc supremum;;

  Record lock, heap no 16 PHYSICAL RECORD: n_fields 8; compact format; info bits 0
   0: len 4; hex 8000003c; asc    <;;
   1: len 6; hex 000000011953; asc      S;;
   2: len 7; hex 3f000001641be9; asc ?   d  ;;
   3: len 5; hex 5330303039; asc S0009;;
   4: len 4; hex 5a61726b; asc Zark;;
   5: len 4; hex 8000001c; asc     ;;
   6: len 4; hex 80000032; asc    2;;
   7: len 4; hex 80000009; asc     ;;
  --------
  ```

9. 插入

  执行的SQL如下:

  ```sql
  insert into locking (id,no,name,age,no_id) values(70,'S00012','Jupiter',28,12);
  ```

  加锁情况如下:

  ```sql
  1 lock struct(s), heap size 1136, 0 row lock(s), undo log entries 1
  MySQL thread id 2, OS thread handle 123145405616128, query id 211 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 72022 lock mode IX
  ```

10. 删除

  执行的SQL如下:

  ```sql
  delete from locking where id = 70;
  ```

  加锁情况如下:

  ```sql
  2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
  MySQL thread id 2, OS thread handle 123145405616128, query id 217 localhost root starting
  show engine innodb status
  TABLE LOCK table `ele`.`locking` trx id 72027 lock mode IX
  RECORD LOCKS space id 784 page no 3 n bits 88 index PRIMARY of table `ele`.`locking` trx id 72027 lock_mode X locks rec but not gap
  Record lock, heap no 17 PHYSICAL RECORD: n_fields 8; compact format; info bits 32
   0: len 4; hex 80000046; asc    F;;
   1: len 6; hex 00000001195b; asc      [;;
   2: len 7; hex 440000014312b6; asc D   C  ;;
   3: len 6; hex 533030303132; asc S00012;;
   4: len 7; hex 4a757069746572; asc Jupiter;;
   5: len 4; hex 8000001c; asc     ;;
   6: SQL NULL;
   7: len 4; hex 8000000c; asc     ;;
  ```
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 1 MySQL锁介绍 2 MySQL表级锁 2.1 表级锁介绍 ​ 表级锁由SQL layer实现。M...
    MiniSoulBigBang阅读 370评论 0 0
  • 原文:http://blog.csdn.net/soonfly/article/details/70238902 ...
    白驹过隙_忽然而已阅读 277评论 0 0
  • 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争...
    薛延祥阅读 204评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,520评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,805评论 4 1