数据库锁底层实现(学习)

一般说到数据库锁都在说锁的类型很少更进一步了解到“锁”(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的比较:

img

latch可以通过命令SHOW ENGINE INNODB MUTEX查看。

命令SHOW ENGINE INNODB MUTEX输出结果说明(Debug版本信息更多):

img

lock可以通过命令SHOW ENGINE INNODB STATUS及information_schema架构下的表INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS来查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值