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提交,释放锁,才能对执行更新语句