僵局的可能性不受隔离级别的影响,因为隔离级别会改变读取操作的行为,而由于写作操作而发生僵局。 但这在小节中与之矛盾。如何最小化和处理僵局,其中说:
那么哪个是真的?僵局不受隔离水平的影响,或者较低的隔离水平可能有助于最大程度地减少僵局?如果您使用锁定读数...尝试使用较低的隔离级别(例如读取的读数)。
我知道RDBMS僵局的主题是复杂的,并且被广泛误解。但是在官方文档中有不清楚的信息根本没有帮助... 是否有MySQL专家愿意清除我的困惑?
这是一个很好的指出。 我认为如果僵局肯定会受到交易级别的影响。由于隔离级别会改变读取操作的行为,而由于写操作而发生僵局。
是一个绝对不正确的语句。 为了给出一个反示例,
BEGIN; UPDATE TABLE_A SET B=5; COMMIT;
将以间隙锁定(给定列不是唯一的索引。)如果隔离电平为
B
。但是,如果隔离水平为
REPEATABLE_READ
READ_COMMITTED
https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html#innodb-gap-locks
可以明确禁用gap锁定。如果将交易隔离级别更改为READ COMMITTED
,则会发生这种情况。在这种情况下,差距锁定被禁用进行搜索和索引扫描,仅用于外键约束检查和重复键检查。
使用
READ COMMITTED
隔离水平也有其他影响。 MySQL评估了WHERE
条件后,发布了非匹配行的记录锁。对于UPDATE
语句,InnoDB
执行“半稳态”读取,使其返回最新的承诺版本到mySQL,以便MySQL可以确定该行是否匹配了WHERE
的UPDATE
条件。