锁是数据库系统区别于文件系统的一个关键特性


锁机制用于管理对共享资源的并发访问,不同的数据库虽然有相同的SQL,但却设计了不同的锁。InnoDB的锁提供了一致性的非锁定读、行级锁支持

lock & latch

latch主要分为mutex和rwlock,用来保证并发线程操作临界资源的正确性,用来保护内存中的数据结构,没有死锁检测机制,这种锁更像是之前在CSAPP中学的锁

lock的对象则是事务,用来锁定数据库的表、页和行

简介

InnoDB中实现了两种行级锁

  • S lock:允许事务读取一行数据
  • X lock:允许事务删除或更新一行数据

上面两种锁,很像CSAPP中提到的读者-写者模型,也就是读写锁

InnoDB也支持不同粒度的锁,但不是特定粒度的锁,而是一种叫做Intention Lock(意向锁),要对记录上锁,就要将对应的页、表和数据库上意向锁。意向锁其实是表级别的锁,又分为

  • IS lock:事务想要获取表中某几行的S lock
  • IX lock:事务想要获取表中某几行的X lock

可以通过mysql> desc information_schema.INNODB_xxx;查看INNODB_TRX(事务的状态信息) INNODB_LOCKS(锁的状态) INNODB_LOCK_WAITS(反应事务请求和等待锁的状态)三张表的结构

一致性非锁定读