意向共享锁与意向排它锁:详解与应用

在数据库系统中,锁机制是保证数据一致性和完整性的关键。除了行级锁和表级锁外,还有一种锁类型,它在数据库的事务处理中扮演着重要的角色——意向锁(Intention Locks)。在这篇博客中,我们将详细讲解意向共享锁(Intention Shared Lock)和意向排它锁(Intention Exclusive Lock)的概念、作用及其应用。

什么是意向锁?

意向锁是一种特殊的锁类型,主要用于表级别的锁管理,它的存在目的是为了避免在行级锁和表级锁之间发生冲突。意向锁不会直接锁定数据行,而是标记表中的某个数据行在未来可能会被锁定的意图。这种锁帮助数据库系统高效地管理并发事务,减少锁冲突,提高性能。

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。

意向共享锁(Intention Shared Lock)

定义:意向共享锁(IS锁)用于表示事务计划在未来对某些行加共享锁。它的存在表明事务对表中的行有意向加共享锁,从而确保其他事务不会在表级别上加排他锁。

方式:自动添加,添加共享锁的时候自动加上意向共享锁

作用

  • 锁管理:通过在表上加意向共享锁,数据库可以有效地协调对行级共享锁的请求,避免了事务直接竞争行级锁的问题。
  • 避免冲突:意向共享锁的存在表明事务将要对表中的某些行加共享锁,其他事务可以避免对表级别的排他锁进行操作。

示例: 假设有两个事务:事务A希望对表中的某些行加共享锁,而事务B希望对整个表加排他锁。为了防止冲突,事务A会首先在表上加意向共享锁,事务B在尝试获取表级排他锁时,会检查表上是否有意向共享锁,以决定是否可以获取锁。

START TRANSACTION;

-- 事务A请求意向共享锁
SELECT * FROM products WHERE product_id = 1 LOCK IN SHARE MODE;

-- 事务B尝试获取排他锁
-- 事务B会检查表上是否存在意向共享锁,如果存在,可能会等待或回滚
LOCK TABLES products WRITE;

COMMIT;

意向排它锁(Intention Exclusive Lock)

定义:意向排它锁(IX锁)用于表示事务计划在未来对某些行加排他锁。它的存在表明事务对表中的行有意向加排他锁,从而阻止其他事务对这些行加共享锁或排他锁。

作用

  • 锁管理:通过在表上加意向排它锁,数据库可以有效地协调对行级排他锁的请求,避免了事务直接竞争行级锁的问题。
  • 避免冲突:意向排它锁的存在表明事务将要对表中的某些行加排他锁,其他事务可以避免对表级别的共享锁进行操作。

方式:自动添加,添加排它锁的时候自动加上意向排它锁

示例: 假设有两个事务:事务A希望对表中的某些行加排他锁,而事务B希望对整个表加共享锁。为了防止冲突,事务A会首先在表上加意向排它锁,事务B在尝试获取表级共享锁时,会检查表上是否有意向排它锁,以决定是否可以获取锁。

START TRANSACTION;

-- 事务A请求意向排它锁
SELECT * FROM products WHERE product_id = 1 FOR UPDATE;

-- 事务B尝试获取共享锁
-- 事务B会检查表上是否存在意向排它锁,如果存在,可能会等待或回滚
LOCK TABLES products READ;

COMMIT;

意向锁的作用

  1. 优化锁管理:意向锁帮助数据库系统高效地管理锁定请求,减少锁冲突和死锁的可能性。
  2. 提高并发性:通过在表级别和行级别使用意向锁,数据库系统能够更好地处理并发事务,提高并发性能。
  3. 减少锁竞争:意向锁减少了事务在尝试获取锁时的直接竞争,允许事务在表级别和行级别之间有序地进行锁定。

实战注意:这里的排它 / 共享锁指的都是表锁!!!意向锁不会与行级的共享 / 排它锁互斥!!!

  session1获取了某一行的排他锁,并未提交:

select*from goods where id=1 for update;

  此时 goods 表存在两把锁:goods 表上的意向排它锁与 id 为 1 的数据行上的排它锁。

  session2 想要获取 goods 表的共享锁:

LOCK TABLES goods READ;

  此时session2 检测session1 持有goods 表的意向排他锁,就可以得知session1必然持有该表中某些数据行的排他锁,那么session2 对 goods 表的加锁请求就会被排斥(阻塞),而无需去检测表中的每一行数据是否存在排它锁。

  

  

总结

意向共享锁和意向排它锁是数据库锁机制中的重要组成部分。它们通过在表级别标记事务的锁定意图,帮助数据库系统更有效地管理并发事务,减少锁冲突,提高性能。理解意向锁的概念和应用场景,有助于更好地设计和优化数据库事务处理策略,从而提高数据库系统的并发能力和数据一致性。

posted @ 2024-08-19 15:15  若-飞  阅读(4)  评论(0编辑  收藏  举报