1. 表级锁和行级锁的概念及区别
表级锁(Table Lock)
表锁是一种较为粗粒度的锁,锁定的是整个表。当某个事务加锁表时,其他事务对该表的任何读写操作都会被阻塞,直到锁被释放。因此,表锁具有较高的冲突概率,尤其是在高并发的环境中。表锁的主要优点是操作简单,适用于表数据量较小且并发请求较少的场景。
- 共享锁(S锁):读锁,只会阻塞写操作,允许其他事务读取。
- 排他锁(X锁):写锁,会阻塞其他事务的读写操作,确保独占访问。
表级锁的特点:
- 适用于低并发的应用场景,操作简单。
- 会在事务执行期间锁住整个表,限制了其他事务的并发执行。
- 可能导致性能瓶颈,尤其在大规模并发时。
意向锁(Intention Lock)
意向锁是InnoDB存储引擎中引入的一种特殊锁,目的是为了避免行锁与表锁之间的冲突。意向锁并不直接锁定某一行数据,而是标记某个事务打算在某一表上加行锁。
意向锁的类型:
- 意向共享锁(IS锁):表示事务打算对某些行加共享锁(S锁)。它与表锁的共享锁(S锁)兼容,但与表锁的排他锁(X锁)互斥。
- 意向排他锁(IX锁):表示事务打算对某些行加排他锁(X锁)。它与表锁的共享锁(S锁)和排他锁(X锁)都互斥,但意向锁之间不会互斥。
意向锁的作用:
- 提高锁的效率:通过在表级别设置意向锁,减少了在查询表级锁时的冲突检查。例如,当一个事务打算对某些行加排他锁时,通过设置意向排他锁(IX锁),可以让其他事务在请求表级锁时知道当前事务的锁意图,从而避免不必要的冲突。
- 避免表锁和行锁之间的冲突:表级锁和行级锁在同一时刻无法兼容,通过意向锁,InnoDB能够减少每次获取表级锁时对每一行的锁状态进行检查,从而提高效率。
- 支持高并发:意向锁使得事务可以更加高效地执行数据操作,在加行锁的同时不必对整个表加锁,减少了并发的阻塞。
意向锁的示例:
- 当事务A对表进行操作,并且打算对某些行加排他锁时,首先会在表上设置一个意向排他锁(IX锁)。如果其他事务也想对表加排他锁,它们必须等待事务A完成并释放锁。
- 如果事务B希望在该表上加一个共享锁(S锁),但事务A已经加了意向排他锁(IX锁),那么事务B会被阻塞,直到事务A释放锁。
行级锁(Row Lock)
行锁是一种较为细粒度的锁,它锁定的是某一行或一组行的数据,允许多个事务并发访问同一表中的不同数据行。行锁能有效减少冲突,但相应地会增加锁管理的开销。行锁通常与索引一起使用,以实现对某一特定数据行的锁定。
- 共享锁(S锁):在行级别加共享锁,允许其他事务读取该行,但阻止写入。
- 排他锁(X锁):在行级别加排他锁,禁止其他事务对该行的读取和写入。
行级锁的特点:
- 适用于高并发的环境,能提高数据访问的并发性。
- 比表锁更细粒度,锁定范围小,减少冲突。
- 需要使用索引以提高锁的效率,否则会出现全表扫描,导致性能下降。
表级锁与行级锁的区别:
特性 | 表锁 | 行锁 |
---|---|---|
锁粒度 | 锁定整个表 | 锁定特定的行或数据块 |
并发性 | 并发性差,可能会阻塞大量操作 | 并发性高,能够实现对不同数据行的并发操作 |
锁管理开销 | 较低,操作简单 | 较高,需要更多的资源和管理 |
性能 | 在低并发环境下性能较好 | 在高并发环境下表现更好 |
适用场景 | 数据量小,事务量少的情况 | 数据量大,事务量高的情况 |