一般说到数据库锁都在说锁的类型很少更进一步了解到“锁”(lock与latch)
锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问,并确保数据的完整性和一致性,实现事务的隔离性要求。
MySQL、Microsoft SQL Server、Oracle等数据库,各自对于锁的实现完全不同。
对于MyISAM引擎,其锁是表锁设计,并发写性能较差。
在Microsoft SQL Server 2005版本之前是页锁的,相对表锁并发性能有所提高。但对于热点数据页的并发问题依然无能为力。到2005版本,Microsoft SQL Server开始支持乐观并发和悲观并发,在乐观并发下开始支持行级锁,但与InnoDB的实现方式完全不同。锁是一种稀有的资源,锁越多开销就越大,因此它会把行锁会升级到表锁,这时并发的性能又回到了以前。
InnoDB锁的实现和Oracle非常类似,提供一致性的非锁定读、行级锁支持。行级锁没有相关额外的开销,并可以同时得到并发性和一致性。
lock与latch
lock与latch都可以被称为“锁”。
lock和latch都是一种并发控制机制,用于保护对共享数据的访问。
lock是长期持有资源的一种机制,它可以在当前线程获得锁之后一直保持,直到释放锁。latch是一种短暂持有资源的机制,一旦线程获得latch之后,它紧接着就会释放。
两者的主要区别在于,Lock主要用来控制多线程对共享资源的访问,而Latch则是用来同步多个线程对于一件事情的进行,只有等待的线程都处于ready状态时,才会开始执行。
latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。
lock与latch的比较:
latch可以通过命令SHOW ENGINE INNODB MUTEX查看。
命令SHOW ENGINE INNODB MUTEX输出结果说明(Debug版本信息更多):
lock可以通过命令SHOW ENGINE INNODB STATUS及information_schema架构下的表INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS来查看。