Mysql—行锁

  • 行锁(InnoDB)

—mysql默认自动commit,oracle默认不会自动commit
Mysql—行锁_第1张图片
为了研究行锁,暂时将自动commit关闭;
set autucommit = 0;

行锁,操作相同数据:
会话0:写操作
insert into linelock values(6,‘a6’);

会话1:写操作,同样的数据(发现锁住了,必须等到会话0 commit或rollback后,才能继续执行)
update linelock set name = ’ax’ where id = 6;

结论1:
1.如果会话X对某条数据a进行DML(增删改)操作(研究时:关闭了自动commit的情况下),则其他会话必须等待会话x结束事务(commit/rollback)后,才能对数据a进行操作。
2.表锁是通过unlock tables解锁,也可以通过事务解锁;行锁是通过事务解锁(commit/rollback)。

行锁,操作不同数据:
会话0:写操作
insert into linelock values(8,‘a8’);

会话1:写操作,不同的数据
update linelock set name = ’ax’ where id = 5;

结论2:
行锁,一次锁一行数据;因此如果操作的是不同数据,则不干扰。

行锁的注意事项:
a.如果没有索引,则行锁会转为表锁
b.行锁的一种特殊情况:间隙锁:值在范围内,但却不存在

行锁:
InnoDB默认采用行锁;
缺点:比表锁性能损耗大
优点:并发能力强,效率高
因此建议,高并发用InnoDB,否则用MyISAM

你可能感兴趣的:(Mysqsl)