返回首页

gbase数据、南大通用产品文档:GBase8s锁的种类

更新日期:2024年09月11日

下表展示 GBase 8s 数据库服务器对不同情况支持的锁的类型。
锁类型
用途
共享的 共享锁为了只读保留它的对象。它防止在该锁保留期间更改该对象。多个程序可
在同一对象上放置共享锁。
在以共享的模式锁定记录时,
多个对象可读取该记录。

排他的 排他锁为了单个程序的使用保留它的对象。
当程序打算更改该对象时,
使用此锁。

您不可在存在任何其他种类锁的地方放置排他锁。在您放置排他锁之后,您不可
在同一对象上放置另一锁。
可提升
的(或
更新)
可提升的(或更新)锁有更新的意图。您仅可在不存在其他可提升锁或排他锁的
地方放置它。您可在已有共享锁的记录上放置可提升锁。当程序要更改该锁定了
的对象时,您可将该可提升锁提升为排他锁,但仅当该锁可能从可提升的更改为
排他的时刻,该记录上没有包括共享锁在内的其他锁时。如果当设置了可提升锁
时,共享锁在该记录上,则在将可提升锁提升为排他锁之前,您必须删除共享锁。

虽然定位更新不适用于所有类型的应用程序,但尽可能使用定位更新和删除。
定位更新(使用 UPDATE WHERE CURRENT OF CURSOR)允许您通过将数据库游标定
位到要更改的行来更新数据,并通知驱动程序更改数据。您不必强制构建复杂的 SQL 语
句;提供要更改的语句。
除了要使代码更易于维护,定位更新通常会提高性能。由于数据库服务器已经在行上定位
(对于当前正在处理 SELECT 语句),因此定位要更改的行的多余查询是不必要的。如果
该行必须定位,则数据库服务器通常具有指向可用行的内部指针(例如 ROWID)。
要支持使用滚动游标定位的 UPDATE 和 DELETE 语句,GBase 8s ODBC Driver 从原始
的定位语句构造一个新的搜索的 UPDATE 或 DELETE 语句。
但是,
数据库服务器不能直
接更新滚动游标。相反,GBase 8s ODBC Driver 会构造一个 WHERE 子句,用于引用在

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 197 -

WHERE CURRENT OF CURSOR 子句中引用的 SELECT 语句中访存的每个列。SELECT
语句的行集数据缓存中的值绑定到已经建立的 WHERE 子句中的每个值。
该定位方法比使用具有 FORWARD ONLY 游标的子句 WHERE CURRENT OF CURSOR
子句更慢,更容易出错。如果访存的行不包含唯一键值,则构建的 WHERE 子句可能标识
一行或多行,
这会导致许多行被删除和更新。
以这种方式删除行会影响定位的 UPDATE 和
DELETE 语句,和使用滚动游标的 SQLSetPos 语句。
使用 SQLSpecialColumns 确定在 WHERE 子句中用于更新数据的最佳列集。很多时候,
伪列提供了对数据的最快访问;您只能通过使用 SQLSpecialColumns 确定这些列。
许多应用程序不能设计为利用定位的更新和删除。
这些应用程序通常通过形成 WHERE 子
句来更新数据。该 WHERE 子句由结果集中返回的一部分列值组成。某些应用程序可能会
使用所有可搜索的结果列或通过调用 SQLStatistics 来查找可能属于唯一索引的列的
WHERE 子句。这些方法通常有效,但是会导致相当复杂的查询。
考虑以下示例:
rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip FROM emp", SQL_NTS);
// fetchdata

rc = SQLExecDirect (hstmt, "UPDATE EMP SET ADDRESS = ?
WHERE first_name = ? AND last_name = ? AND ssn = ? AND
address = ? AND city = ? AND state = ? AND zip = ?", SQL_NTS);
// fairly complex query
应用程序应该调用 SQLSpecialColumns/SQL_BEST_ROWID 检索标识任何给定记录的最
佳列集(可能是伪列)。许多数据库支持在表定义中没有显式用户定义的特定列,但是是
每个表的隐藏列(例如,ROWID 、TID 和其它列)。这些伪列总是提供对数据的最快访
问。因为它们通常指向记录的确切位置。因为伪列不是显式表定义的一部分,所以它们不
会从 SQLSpecialColumns 返回。确定伪列是否存在的唯一方法是调用 SQLSpecialColumns。

考虑之前的示例,这次使用 SQLSpecialColumns:

rc = SQLSpecialColumns (hstmt, ..... 'emp', ...);

rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip, ROWID FROM emp", SQL_NTS);
// fetch data and probably "hide" ROWID from the user

rc = SQLExecDirect (hstmt, "UPDATE emp SET address = ? WHERE
ROWID = ?", SQL_NTS);
// fastest access to the data!

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 198 -

如果您的数据源不包含特定的伪列,则 SQLSpecialColumns的结果集由指定表上的最佳唯
一索引组成(如果唯一索引存在)。因此,您的应用程序不会另外调用 SQLStatistics 来查
找最小的唯一索引。

GS_CLIENT_GLOBAL_KEYS 系统表记录密态等值特性中客户端加密主密钥相关信息,
每条记录对应一个客户端加密主密钥。
名称
类型
描述
oid
oid
行标识符(隐含字段)。
global_key_name
name
客户端加密主密钥(cmk)名称。
key_namespace
oid
包含此客户端加密主密钥(cmk)的命
名空间oid。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
733
名称
类型
描述
key_owner
oid
客户端加密主密钥(cmk)的所有者。
key_acl
aclitem[]
创建该密钥时所拥有的访问权限。
create_date
timestamp
创建密钥的时间。