返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

gbase_thread_id
..............................
48

要防止同时访问智能大对象数据,
当打开智能大对象时,
数据库服务器取得对此数据的锁。
此智能大对象锁不同于以下种类的锁:

行锁
智能大对象上的锁不锁定智能大对象驻留其中的行。然而,如果您从行检索智能大
对象,且该行仍为当前的,则数据库服务器可能持有行锁以及智能大对象锁。在智
能大对象上持有锁,而不是在行上,因为许多列可能访问同一智能大对象数据。

在表的同一行中,不同智能大对象的锁
智能大对象上的锁不影响该行中的其他智能大对象。
下表展示智能大对象可支持的锁模式。
表 1. 智能大对象的锁模式
锁模式
用途
描述
lock-all
锁定整个智能大对象
指示锁请求适用于智能大对象的所有数据
byte-range
仅锁定智能大对象指定的
部分
指示锁请求仅适用于指定字节数的智能大对
象数据
当服务器打开智能大对象时,它使用下列信息来确定智能大对象的锁模式:

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

智能大对象的访问模式
数据库服务器取得如下锁:

在共享模式下,当打开智能大对象来读取时(read-only)

在更新模式下,
当打开智能大对象来写时
(write-only、
read/write、
write/append)

当在智能大对象上实际执行写操作(或某其他更新)时,服务器将此锁升级
为排他锁。

当前事务的隔离级别
如果数据库表的隔离模式为 Repeatable Read,
则服务器不释放它在智能大对象上取
得的任何锁,直到事务结束为止。
在缺省情况下,服务器选择 lock-all 锁模式。
服务器保留该锁如下:

它持有共享模式锁和更新锁
(其尚未升级至排他锁)

直到发生下列事件之一为止:

智能大对象关闭

事务结束

显式的请求来释放锁(仅对于 byte-range 锁)

它持有排他锁,直到事务结束为止,即使关闭智能大对象也如此。
当发生前述条件之一时,服务器释放智能大对象上的锁。
重要: 即使智能大对象保持打开,在事务结束时,也会丢失锁。当服务器检测到智能大对象没
有活动的锁时,当首次发生智能大对象访问时,它自动地取得新的锁。它取得的锁是基于智能
大对象的原始访问模式的。
当当前事务终止时,服务器释放锁。然而,当执行下一需要锁的函数时,服务器再次取得
锁。
如果这不是期望的行为,
则服务器侧 SQL 应用程序可使用 BEGIN WORK 事务阻塞,
并在需要使用该锁的最后语句之后放置 COMMIT WORK 或 ROLLBACK WORK 语句。
byte-range 锁定
在缺省情况下,
当数据库服务器需要锁定智能大对象时,
它全部使用 lock-all 锁。
lock-all 锁
是一种 “全都或全不” 锁;也就是说,它们锁定整个智能大对象。当数据库服务器取得
排他锁时,只要持有锁,其他用户就不可访问智能大对象的数据。
如果此锁定对于应用程序的并发要求过于苛刻,则可使用 byte-range 锁定,而不使用
lock-all 锁定。以 byte-range 锁定,您可指定在智能大对象数据中锁定的字节范围。如果
其他用户访问该数据的其他部分,他们仍可获得自己的 byte-range 锁。
请使用 IfxSmartBlob 类中的 IfxLoLock() 方法,来指定 byte-range 锁定:
public long IfxLoLock(int lofd, long offset, int whence, long
range, int lockmode) throws SQLException

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 163
-
要解锁该对象中的字节范围,请使用 IfxLoUnLock() 方法:
public long IfxLoUnLock( int lofd, long offset, int whence, long
range) throws SQLException
lofd 参数是由 IfxLoCreate() 或 IfxLoOpen() 方法返回的定位器文件描述符。offset 参数是从
开始的查找位置的偏移量。whence 参数标识开始的查找位置。在 智能大对象内的位置 中
的表中描述这些值。
range 参数指示在智能大对象内要锁定或解锁的字节数。
lockmode 参数指示要创建什么类型
的锁。这些值可为
IfxSmartBlob.LO_EXCLUSIVE_MODE 或 IfxSmartBlob.LO_SHARED_MODE。

Invalid fetch direction value
一个无效的访存方向被作为参数传送
到 Statement.setFetchDirection() 或 ResultSet.setFetchDirection() 方法。有效值为
FETCH_FORWARD 、FETCH_REVERSE 和 FETCH_UNKNOWN。