1.什么是锁
锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。InnoDB存储引擎会在行级别上对表数据上锁,这固然不错,不过
InnoDB存储引擎也会在数据库内部其他多个地方使用锁,从而允许对多种不同的资源提供并发访问。例如 操作缓冲池中的LRU列表。删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入,数据库系统使用锁是为了支持对共享资源进行并发访问,提供一致性。
对于MyISAM引擎,其锁死表锁设计,并发情况下读是没问题的,但是并发插入性能就要差一些了,若插入在底部,MyISAM存储引擎还是可以有一定的并发写入操作。对于 sql server 2005之前都是页锁的,相对表锁的MyISAM引擎来说,并发性能有所提高,页锁也容易实现,然而对于热点数据页的并发问题依然无能为力,到 sql server 2005版本开始支持乐观并发和悲观并发,在乐观并发下开始支持行级锁,但是实现方式与InnoDB存储引擎的实现完全不同,sql server 的锁是一种稀有资源,锁的行越多开销越大,因此会锁升级,行锁升级为页锁 到区域锁 最终到表锁,这时候并发性能就会下降。
InnoDB存储引擎锁的实现和oracle非常类似,是通过提供一致性非锁定读、行级锁支持。 行级锁没有相关额外的开销,并可以同时得到并发性和一致性。
lock 和 latch 锁和闩锁
这里我们先来区分数据库中两种锁 lock锁 和 latch 闩锁, latch因为其要求锁定时间非常短,如果持续时间长则导致性能非常差,在InnoDB中,latch又分为 mutex(互斥锁) 和 rwlock(读写锁),其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁的检测机制。
lock的对象是事务,用来锁定的是数据库的对象,比如表 页 行,并且一般的lock对象仅仅事务commit 和 rollback后进行释放(不同隔离级别释放时间不同),此外lock是有死锁检测机制的。下面比较看看他们的区别