InnoDB 中的意向锁是为了更容易检测表锁和行级锁之间的冲突,但实际上 MDL (元数据锁)已经完成了这件事情。
例如事务 t1 更新表的某一行,会持有该表的元数据锁 SHARED_WRITE ,当事务 t2 去 lock tables ... 锁表时,需要先获取该表的元数据锁 SHARED_NO_READ_WRITE/SHARED_READ_ONLY , 但这两个元数据锁已经与 SHARED_WRITE 锁互斥了,t2 也会阻塞在 Waiting for table metadata lock 阶段。
所以意向锁的作用体现在哪?
1
L0L 2023-06-02 09:18:19 +08:00
@SimbaPeng 我是一个应用开发的从业者,对 MySQL 的原理知道很少,但也很好奇这个答案。
OP 描述中 t2 事务有一些疑问,想咨询下 OP: “当事务 t2 去 lock tables ... 锁表时,需要先获取该表的元数据锁 SHARED_NO_READ_WRITE/SHARED_READ_ONLY“ 这里的 t2 事务是需要对整个表进行锁表呢?还是说只是对同一行数据进行锁表呢? |
3
doraf 2023-06-02 17:03:05 +08:00
我觉得对于这个场景来说,意向锁就是不起作用。
我觉得意向锁只是用于在表这个级别的锁兼容性判断,如果表这个级别不能满足,那就不会再去判断更细粒度的锁。 我也很好奇~~ |
4
ijyuqi 2023-06-02 20:12:42 +08:00 via iPhone
意向锁( Intention Locks )和元数据锁( Metadata Locks )是 MySQL 中不同的锁定机制,它们有不同的作用和应用场景。
1. 意向锁( Intention Locks ): - 作用:在 MySQL InnoDB 引擎中,意向锁用于帮助检测表级锁和行级锁之间的冲突,以提高并发性能和减少等待时间。 - 类型:意向锁分为意向共享锁( Intention Shared, IS )和意向排他锁( Intention Exclusive, IX )。 - 使用场景:当事务需要获取行级别锁时,首先会尝试获取表级别的意向锁。意向锁的目的是通知其他事务当前事务打算对表进行何种级别的锁定,以避免冲突。 2. 元数据锁( Metadata Locks ): - 作用:元数据锁用于管理数据库对象(例如表、函数、存储过程等)的结构和状态,以保证数据的一致性和完整性。 - 使用场景:当一个事务对某个数据库对象进行修改(例如表结构的更改)时,会获取该对象的元数据锁,以防止其他事务同时对该对象进行并发的操作。元数据锁可以确保数据定义的一致性,并避免数据结构的冲突。 因此,意向锁主要用于并发控制和冲突检测,以提高事务对行级别锁的处理效率,而元数据锁主要用于管理数据库对象的结构和状态,确保数据的一致性和完整性。它们在 MySQL 中的作用和应用场景不同,但都是为了保证数据库操作的正确性和并发性能的优化。 |