mysql 第8.12章 事务-记录锁、间隙锁与临键锁 mysql 第8.12章 事务-记录锁、间隙锁与临键锁

9小时前

在 MySQL 的 InnoDB 存储引擎中,行锁是一种关键机制,用于在高并发环境下实现数据的一致性和隔离性。InnoDB 支持三种主要的行锁类型:记录锁、间隙锁和临键锁。每种锁有不同的锁定范围和用途,用于处理各种并发控制场景。

一、记录锁

(Record Locks)

概念:

  • 记录锁是锁定单个数据行,以确保在锁定期间其他事务无法修改或删除该行数据。记录锁是最基本的行级锁。

特性:

  • 锁定单行数据:只对特定的行进行锁定,其他行可以被并发访问。

  • 精确锁定:精确到具体的记录,避免了不必要的锁竞争。

  • 应用场景:适用于需要保护特定记录的并发事务,如更新或删除操作。

示例:

  • 如果有一个表 employees,事务 A 对某一员工记录加锁,那么在事务 A 提交或回滚之前,其他事务不能对该员工记录进行修改。

二、间隙锁

(Gap Locks)

概念:

  • 间隙锁是对记录间隙(即数据行之间的空白区间)加锁,以防止在该区间内插入新的记录。间隙锁防止了其他事务在当前事务锁定的区间内插入新的数据行,从而确保数据一致性。

特性:

  • 锁定间隙:锁定记录之间的“间隙”,以防止插入新的记录。

  • 不锁定已有记录:间隙锁不会锁定已有的记录,只锁定记录之间的间隙。

  • 应用场景:用于防止其他事务插入新记录,适用于处理范围查询或范围更新时。

示例:

  • 在一个有序的表 employees 上,事务 A 对某一范围的记录进行查询或修改,InnoDB 会在该范围内加锁,以防止其他事务插入新的记录到该范围内。

三、临键锁

(Next-Key Locks)

概念:

  • 临键锁是记录锁和间隙锁的组合,锁定一个记录及其前面的间隙。临键锁确保了对某一记录的锁定,并同时锁定该记录之前的间隙,从而防止其他事务插入到该记录的前面或修改该记录。

特性:

  • 组合锁定:同时锁定记录和记录之前的间隙。

  • 避免幻读:防止在事务中插入或修改数据的同时出现幻读问题。

  • 应用场景:适用于需要避免幻读的事务,特别是在有唯一索引的表中,临键锁能够确保事务的隔离性和一致性。

示例:

  • 在表 employees 中,如果事务 A 对某一记录加锁,InnoDB 会锁定该记录及其前面的间隙,以防止其他事务插入新的记录到该记录前面的间隙中。

四、行锁的作用和实现

避免死锁:行锁机制通过锁定特定记录和间隙,减少了表级锁竞争,从而降低了死锁的可能性。

提高并发性:通过锁定粒度较小的行,而不是整个表,InnoDB 能够在高并发环境下提供更好的性能和可伸缩性。

保证事务隔离性:行锁机制通过控制数据的并发访问,确保事务的隔离性和一致性,避免了数据竞争和不一致的问题。

五、小结

记录锁:锁定单个记录,适用于对特定记录的操作。

间隙锁:锁定记录之间的间隙,防止插入新记录。

临键锁:组合了记录锁和间隙锁,锁定记录及其前面的间隙,确保事务隔离性。

这三种锁机制在 InnoDB 中共同工作,以处理复杂的并发操作和数据一致性问题。在设计数据库和事务时,了解这些锁机制有助于优化性能和避免潜在的并发问题。

阅读 12

mysql文章
带到手机上看