--建表
CREATE TABLE t1(`id` int(11) NOT NULL,`value` int(11) NOT NULLPRIMARY KEY (`id`),KEY `idx_value` (`value`)
);
--插入初始数据
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);--事务1
select count(*) from t1 where value=1 for update;
--事务2
update t1 set value=2 where id=1;
在高并发场景下事务1和事务2会发生死锁。
Mysql基础(十九):锁
MySQL 加锁机制验证记录 | 三点水
首先需要知道的是,MySQL的行锁是对索引项加锁,可重复读隔离级别下具体的加锁方式如下:
SQL操作的索引 | 加锁方式 |
---|---|
主键索引 | 对应的主键索引项加行锁 |
唯一索引 | 对应的唯一索引项+对应的主键索引项都加行锁 |
非唯一索引 | 对应的索引项加NextKey锁,对应的主键索引项加行锁 |
无索引 | 对所有的主键索引项加NextKey锁,实际效果如同锁表 |
NextKey锁即行锁+间隙锁,用于锁定一个范围,主要用于解决幻读的问题
--建表
CREATE TABLE t1(`id` int(11) NOT NULL,`value` int(11) NOT NULLPRIMARY KEY (`id`),KEY `idx_value` (`value`)
);
--插入初始数据
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);--事务1
select count(*) from t1 where value=1 for update;
--事务2
update t1 set value=2 where id=1;