mysql 行锁两阶段
行锁
优点:
比起表锁,可以支持更大的并发
行锁的实现
由存储引擎自已实现,每个存储引擎实现的方式都不一样
MyISAM 引擎不支持行锁
两阶段锁
在更新数据时,需要对数据所在行加锁,但更新数据完成后,锁并不会马上释放,而是要等到事务提交才释放
create table t_07_recordlock(
id int not null auto_increment primary key,
c int,
d int,
key c (c)
) engine=innodb;
insert into t_07_recordlock values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5);
Session A | Session B | |
---|---|---|
T1 | Begin; | begin; |
T2 | update t_07_recordlock set d=d+1 where id = 1; | |
update t_07_recordlock set d=d+1 where id = 2; | ||
T3 | update t_07_recordlock set d=d+1 where id = 1; | |
T4 | Commit |
- T2时刻,SessionA已经完成了对两行数据的更新,但没有提交
- T3时候,SessionB对id=1的行进行更新,由于Session A没有提交,其依然持有id=1上的写锁,与Session B要加的写锁互斥,所以SessionB被阻塞,直到Session A提交,释放锁,才能对执行更新语句