行和键锁

您可锁定表的一行。在其他程序继续处理同一表的其他行时,程序可锁定一行或选择的多行。

行和键锁定不是缺省的行为。当您创建表时,您必须指定行级别锁定。下列示例创建带有行级别锁定的表:
CREATE TABLE tab1 
        (
        col1...
        ) LOCK MODE ROW;
当您创建表时,如果指定 LOCK MODE 子句,则您可稍后使用 ALTER TABLE 语句来更改锁定模式。下列语句将保留表上的锁定模式更改为页级别锁定:
ALTER TABLE tab1 LOCK MODE PAGE

在某些情况下,数据库服务器必须锁定不存在的行。要这样做,数据库服务器在索引键值上放置一个锁。使用键锁与使用行锁一样。当表使用行锁定时,作为假想行上的锁来实现键锁。当表使用页锁定时,在包含该键或如果存在则包含该键的索引页上放置一键锁。

当您插入、更新或删除键(当您插入、更新或删除行时,自动地执行)时,数据库服务器在该索引的键上创建锁。

当您更新较少行数时,由于它们提高并发性,因此行和键锁通常提供最佳性能。然而,数据库服务器在获取锁时会造成一些开销。

当通过排他锁来锁定表中的一行或多行时,对其他用户的影响部分地依赖于它们的事务隔离级别。其隔离级别不是 Dirty Read 的其他用户可能遇到事务失败,这是由于在指定的时限内,未释放了排他锁。

对于 Committed Read 或 Dirty Read 隔离级别操作,这些操作尝试访问那些并发的会话已在其上设置了排他的行级别锁的表,为了降低锁定冲突的风险,可启用事务来读取锁定了的行中数据的最近提交的版本,而不是等待提交或回滚设置该锁的那个事务。启用对排他地锁定了的行的最后提交的版本的访问,可以采用几种方式来实现:

仅当行级别锁定生效时,而不是当另一会话持有对整个表的排他锁时,此 LAST COMMITTED 才有用。对于任何 LOCK TABLE 语句在其上应用表级别锁的任何表,禁用此特性。请参阅 GBase 8s SQL 指南:语法 中的 SET ENVIRONMENT 语句的描述,要获取关于对并发访问通过排他锁锁定其中一些行的表的此特性的更多信息,以及对于可支持此特性的表的种类限制的更多信息,请参阅 GBase 8s 管理员参考手册 中的 USELASTCOMMITTED 配置参数的描述。