mysql next key_mysql的next-key locking

nextkey-locking

表结构:(a列主键,b列非唯一索引)

mysql> desc t_innodb;

+-------+------------+------+-----+---------+-------+

| Field | Type       | Null | Key | Default | Extra |

+-------+------------+------+-----+---------+-------+

| a     | int(11)    | NO   | PRI | 0       |       |

| b     | varchar(5) | YES  | MUL | NULL    |       |

| c     | varchar(6) | YES  |     | NULL    |       |

+-------+------------+------+-----+---------+-------+

3 rows in set (0.00 sec)

两个并发:

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> update t_innodb set c='sohu' where b='xxx';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

其他session的情况:

mysql> select * from t_innodb;

+----+------+--------+

| a  | b    | c      |

+----+------+--------+

|  1 | xxx  | NULL   |

|  2 | yyy  | NULL   |

|  3 | ccc  | NULL   |

|  4 | ddd  | NULL   |

|  5 | eee  | NULL   |

|  6 | aaa  | taobao |

|  7 | bbb  | baidu  |

|  8 | ccc  | NULL   |

|  9 | ddd  | NULL   |

| 10 | eee  | NULL   |

+----+------+--------+

10 rows in set (0.00 sec)

mysql> insert into t_innodb values(11,'aaa','sina');

Query OK, 1 row affected (0.05 sec)

mysql> insert into t_innodb values(12,'xxx','sina');

session被阻塞。。。

mysql> insert into t_innodb(a,c) values(12,'sina');

Query OK, 1 row affected (0.06 sec)

mysql> insert into t_innodb values(13,'xxy','sina');

session被阻塞。。。

mysql> insert into t_innodb values(13,'yyy','sina');

Query OK, 1 row affected (0.05 sec)

mysql> insert into t_innodb values(16,'www','sina');

session被阻塞。。。

mysql> insert into t_innodb values(16,'ddf','sina');

Query OK, 1 row affected (0.05 sec)

mysql> insert into t_innodb values(18,'eee','sina');

session被阻塞。。。

mysql> insert into t_innodb values(18,'eed','sina');

Query OK, 1 row affected (0.07 sec)

【结论】:b列上的非唯一索引,当‘xxx’行被锁定后,再插入与‘xxx’相同值就会发生阻塞;

只有更新/插入与‘xxx’行无关的行数据时,才不会被阻塞(包括不明确的b列也不会被阻塞)。

对于b列值'xxx'与'yyy'之间,'eee'与'xxx'之间的值的插入和更新都会被阻塞(‘yyy’值的插入和更新不会被阻塞),这就是next-key locking,为了保护session1的可能动作。

即 [eee,xxx]与[xxx,yyy),区间内的b值都会被锁定,即“上闭下开都锁定”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值