内部锁定表

数据库服务器在内部锁表中存储锁。当数据库服务器读取一行时,它会检查锁表中是否列出了该行或与该行相关联的页、表或数据库。 如果锁表中已列出,数据库服务器还必须检查锁定类型。

下表显示锁表可以包含的锁类型。
锁定类型 描述 通常用于添加锁定的语句
S 共享锁定 SELECT
X 互斥锁定 INSERT, UPDATE, DELETE
U 更新锁定 更新游标中的 SELECT
B 字节锁定 任何更新 VARCHAR 列的语句

只有在缩小 VARCHAR 列中数据值的大小时,才会生成字节锁定。只有前滚和回滚操作才存在字节锁定,因此只有在处理一个使用日志记录的数据库时,才创建字节锁定。只有在使用行级别锁定时,字节锁才会出现在 onstat -k 输出中;否则,字节锁就会与页锁合并。

另外,锁表还可能存储意向锁,这是一种与前面显示的相同的锁定类型。 在某些情况下,用户可能需要注册要锁定某个项目的可能意向,从而使其他用户不能对该项目加上锁定。

根据操作类型和隔离级别,数据库服务器可能继续读取该行并对该行放置自己的锁定,或者可能等待锁定被释放(如果用户执行了 SET LOCK MODE TO WAIT)。下表显示了在另一个用户保持着某种类型的锁定时,一个用户可以加上的锁定。 例如:如果一个用户对某个项目保持着互斥锁定,而另一个用户请求任何种类锁定(互斥、更新或者共享)时,均会收到一条错误。
  保持 X 锁定 保持 U 锁定 保持 S 锁定
请求 X 锁定
请求 U 锁定
请求 S 锁定