MySQL有行级锁,表级锁,下面是他们的区别
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
现在我有几个问题:
1.为什么行级锁会出现死锁而表级锁不会,怎么理解?
2.为什么行级锁发生锁冲突低而表级锁高,怎么理解?
3.死锁与锁冲突概念如何理解?区别是啥?
MySQL有行级锁,表级锁,下面是他们的区别
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
现在我有几个问题:
1.为什么行级锁会出现死锁而表级锁不会,怎么理解?
2.为什么行级锁发生锁冲突低而表级锁高,怎么理解?
3.死锁与锁冲突概念如何理解?区别是啥?
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.2k 阅读✓ 已解决
3 回答2k 阅读
2 回答2k 阅读
表级锁一般是指的 MyISAM 存储引擎,因为它会一次性获取所有需要的锁,所以要么全部都满足,要不就一个都没有,因此不会产生死锁。而行锁就不同了,如果 A 操作先对记录 1 加锁,然后对 2 加锁,B操作先对记录 2 加锁,后对1 加锁,这样就会产生一种情况,A 对 1 加锁,B 对 2 加锁,然后 A 等待 B 释放记录 2 的锁,B 则等待 A 释放 1 的锁,互相等待,就产生死锁了。
行锁只对操作的记录加锁,而同时操作同一条记录的概率是很低的,因此出现索冲突的概率也是很低的,而表锁不一样了,同时访问一个表的概率一般会很高,一次把整个表都锁了,所有对同一个表的操作都只能等待其它操作释放锁,因此冲突比较高
死锁是两个锁互相等待,互不相让,然后大家就都僵持在那里了。锁冲突则是一种正常现象,我需要加锁,但是现在别人持有锁,我无法完成加锁操作,这就是冲突,但是我可以等待别人释放了之后重新加锁。