锁,是数据库区别于文件系统的一个关键特性。
锁机制用于管理对共享资源的并发访问。
锁在数据库中是为了解决并发问题的。
对共享空间来说,存在并发,并发就需要使用锁来实现并发控制。
Mutex和Latch锁:用来保护链。
情景:
A线程想把链中的某个数据从冷区放到热区。B线程想把某个数据给删除。如果没有锁的话,就会出现冲突。
对chain(链)的保护:
- ①mutex锁:排他锁。适用于不经常出现并发的链,或者并发时间很短的。
- ②latch锁:比mutex大点。r、rw。适用于经常出现并发访问的链,且并发时间比较长。
本人的另一篇笔记:latch的争用
http://blog.csdn.net/qq_18312025/article/details/78587334
1.引入
锁,是用来管理对共享文件的并发访问。
latch称为栓锁(轻量级的锁),因为其要求锁的时间非常短。
在innodb存储引擎中,又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临街资源的正确性,并且通常没有死锁检测的机制。
而lock锁的对象是事务,用来锁定数据库的对象,如表、页、行。并且一般lock的对象仅在事务commit或者rollback后释放(不同事务的隔离级别释放的时间可能不一样)。有死锁机制。
2.latch争用的过程
当一个线程持有latch时(也就是对这个链进行操作的时候),其他的线程得在一边看着。比如线程1持有latch,正在对freelist进行遍历,线程2也想进行遍历,是不可能的,所以现在线程2阻塞,只有两种选择,一是退出,二是等待,但如果等待就会占用cpu,如果想占用cpu就要有事可做,否则cpu’会把没事做的线程踢出去,所以线程2就会执行某段空代码来让自己忙起来(所以虽然线程2在等待,但cpu还是忙碌的)。
3.线程2的三种情况:
- gets:去试试能不能获得latch锁;
- misses:获取latch锁失败;
- sleeps:去执行空代码让自己看起来忙了。
4.latch争用的现象:
- 1.latch争用会表现为cpu繁忙;
- 2.latch争用没有排队。
原因: