如果用户删除事务中的行,那么该行无法锁定,因为它不存在。 然而,数据库必须以某种方式记录在事务结束之前,该行还是存在的。 数据库服务器使用键值锁定来锁定已删除的行。
数据库服务器删除某行时,表索引中的键值并不马上除去。 而是每一个键值都标记为已删除,并在键值上加上锁定。
其他用户可能会遇到标记为已删除的键值。 数据库服务器必须确定某个锁定是否存在。如果锁定存在,那么不进行删除,数据库服务器将一条锁定错误发回至应用程序(或者如果用户执行 SET LOCK MODE TO WAIT,那么它将等待该锁定被解除)。
键值锁定其中一个最重要的用处是,确保唯一关键字在删除它的事务的整个过程中,均保持唯一。 如果没有这种保护机制,用户 A 可能会删除事务中的唯一关键字,而且用户 B 可能会在事务执行之前以相同的关键字插入某行。 此种应用场合使得用户 A 不可能进行回滚。 键值锁定防止了用户 B 在用户 A 的事务结束之前插入行。