如果两个actor同时持有IX锁,是否可以将IX锁升级为X锁?



根据,https://mariadb.com/kb/en/innodb-lock-modes/

如果持有in X或S锁,则不授予IX锁。如果持有IX或is锁,则授予该锁

这意味着两个线程可以并发地持有IX锁。

再次,from doc

如果持有其他锁(X, S, IX, is),则不授予X锁。

这意味着如果两个线程有IX锁,那么它不能升级到X锁。

我在这里读到IX锁只适用于表级锁,它允许在IX在表级上运行时仍然锁定单个行。当DML正在对该表执行时,可以用来防止DDL操作。

如果是这样的话,那么如果两个线程在表上有IX个锁,那么它们中的任何一个或第三个线程如何能够为DDL操作获得表上的X个锁呢?这是否意味着需要释放两个IX锁才能为DDL操作获取X锁?

文档写得很不清楚,因为他们使用了术语"X锁";含糊不清地。在一些文档中,它意味着排他表锁,在其他地方,它意味着排他行锁。

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html innodb-intention-locks说:

意图锁不块除了全表请求(例如,锁表…写)。意图锁的主要目的是显示某人正在锁定表中的一行,或者将要锁定表中的一行。

一个IX锁阻塞了一个X表的锁。也就是说,可以有许多事务执行INSERT/UPDATE/DELETE操作并持有行级X锁。所有这些事务还持有IX表锁。任何试图执行DDL的客户端都需要一个表级的X锁,所以如果有任何事务正在进行中,它会阻塞DDL。

反之亦然。表级的X锁还会阻止任何事务获取IX锁。这意味着不能在表被修改时对表执行DML操作,例如

如果他们对不同类型的锁使用一些不同的术语,这就容易多了。

最新更新