1、什么是锁
锁机制用于管理对共享资源的并发访问。
lock与latch
latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放。不同事务隔离级别释放的时间可能不同,所以分析lock问题,要先看事务隔离级别(select @@tx_isolation;)。
2、MyISAM存储引擎中的锁
MyISAM存储引擎只支持表锁。
MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。
但它认为写锁的优先级比读锁高,所以即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!
这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。
可以通过一些设置来调节MyISAM的调度行为。
3、InnoDB存储引擎中的锁
3.1 锁的类型
InnoDB存储引擎实现了如下两种标准的行级锁:<