InnoDB 中的锁应用

114 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

一、锁作用定义

  • 锁机制用来管理对共享资源的并发访问。
  • InnoDB 储存引擎的锁会在行级上对表数据上锁,除此之外还会对 LRU 列表中的删除、添加、移动行为上锁。
  • 在数据库系统中使用锁能够支持了对共享资源的并发访问,以此提供了数据的完整性和一致性。

二、lock 锁与 latch 锁

  • latch 锁 是轻量级的锁,要求锁定的时间很短。若持续时间长就会造成性能很差的后果。
  • latch 包括 mutex (互斥量)和 rwlock (读写锁),通过这些设置,保证了并发线程操作临界资源的正确性,所以一般没有死锁检测机制。
  • lock 对象是事务,可见这是用来锁定数据库中的对象(表、页、列)。lock 的对象一般在事务 commitrollback 后释放。

三、行级锁

IMG_20220730_211251.jpg

  • InnoDB 行级锁包括两种:共享锁、排他锁。
  • 共享锁 (S Lock) 即允许事务读一行数据。两个及以上事务都可以对行 r 上锁并读取数据,称为锁兼容。
  • 排他锁 (X Lock) 即允许事务删除或更新一行数据。只允许一个事务对行 r 上锁并修改数据。
  • S 锁和 X 锁都是行锁,所以兼容是指对同一行记录锁的兼容性状况。
  • 还有一种称为意向锁的锁方式,即将锁的对象分为多个层次,并希望在更细粒度上进行加锁,如上图。
  • 意向锁包括:意向共享锁、意向排他锁。
  • 意向共享锁 IS Lock 即事务想要获得一张表中的某几行的共享锁。
  • 意向排他锁 IX Lock 即事务想要获得一张表中的某几行的排他锁,兼容性如下。

66898.jpeg

四、自增长与锁

  • 自增长是数据库常见属性,每个自增长值表都有自增长计数器,可以通过执行以下语句进行初始化。
select max(auto_inc_col) from t for update;
  • 这种锁称为 AUTO-INC Locking,采用了一种特殊的锁机制:在完成对自增长插入的 SQL 语句后立即释放,而不是在事务完成后才释放。以此提高了插入的性能。此方法虽然提高了并发插入效率,但是对有自增长的列并发插入效率没有帮助,因为他必须要等待前一个插入的完成。当有大量数据插入时也会影响性能,因为有事务会被阻塞。

五、外键与锁

  • 外键主要作用于引用完整性和约束检查。InnoDB 会自动给外键列添加一个索引,这样就可以避免表锁了。