返回首页

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

更新日期:2024年09月11日

OCC 与2PL 的区别举例
下面是会话同时更新同一个表时,两种用户体验的区别:悲观(针对基于磁盘的表)和
乐观(针对MOT 表)。
本例中,使用如下表测试命令:
table “TEST” – create table test (x int, y int, z int, primary key(x));
本示例描述同一测试的两个方面:用户体验(本示例中的操作)和重试要求。
悲观方法示例——用于基于磁盘的表
下面是一个悲观方法例子(非MOT)。任何隔离级别都可能适用。
以下两个会话执行尝试更新单个表的事务。
WAIT LOCK 操作发生,客户端体验是:会话2 卡住,直到会话1 完成COMMIT,会
话2 才能进行。
但是,使用这种方法时,两个会话都成功,并且不会发生异常中止(除非应用了
SERIALIZABLE 或REPEATABLE-READ 隔离级别),这会导致整个事务需要重试。
表13- 5 悲观方法代码示例
时间
会话1
会话2
t0
Begin
Begin
t1
update test set y=200 where x=1;
t2
y=200
Update test set y=300 where x=1; – Wait
on lock
t4
Commit
Unlock
Commit
(in
READ-COMMITTED
this
will
succeed, in SERIALIZABLE it will fail)
y = 300

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
487
乐观方法示例——用于MOT
下面是一个乐观方法的例子。
它描述了创建一个MOT 表,然后有两个并发会话同时更新同一个MOT 表的情况。
create foreign table test (x int, y int, z int, primary key(x));

OCC 的优点是,在COMMIT 之前没有锁。

OCC 的缺点是,如果另一个会话更新了相同的记录,则更新可能会失败。如果更新失
败(在所有支持的隔离级别中),则必须重试整个会话#2 事务。

更新冲突由内核在提交时通过版本检查机制检测。

会话2 将不会等待其更新操作,并且由于在提交阶段检测到冲突而中止。
表13- 6 乐观方法代码示例——用于MOT
时间
会话1
会话2
t0
Begin
Begin
t1
update test set y=200 where
x=1;
t2
y=200
Update test set y=300 where
x=1;
t4
Commit
y = 300
Commit
ABORT
y = 200

ifx_getenv() 函数检索当前环境变量的值。
语法
char *ifx_getenv( varname );
const char *varname;
varname
指向包含环境变量的名称的缓冲区的指针。

用法
ifx_getenv() 函数以下列顺序来搜索环境变量:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 711 -
应用程序以 ifx_putenv() 函数或直接地修改了或定义了的 GBase 8s 环境变量的表
(InetLogin 结构)
用户以 Setnet32 实用程序已在 Registry 中定义了的 GBase 8s 环境变量的表
从 C 运行时刻环境变量检索的非 GBase 8s 环境变量
定义了的 GBase 8s 环境变量的缺省值的表
ifx_getenv() 函数不区分大小写。您以大写或小写指定环境变量的名称。
ifx_getenv() 仅对 C 运行时刻库可访问的数据结构进行操作,而不对操作系统为进程
创建的环境段进行操作。因此,使用 ifx_getenv() 的程序可能检索无效的信息。
ifx_putenv() 和 ifx_getenv() 函数使用全局变量 _environ 指向的环境的副本来访问
该环境。
下列程序片段使用 ifx_getenv() 来检索 GBASEDBTDIR 环境变量的当前值:
char GbasedbtDirVal[100];

/* Get current value of GBASEDBTDIR */
GbasedbtDirVal = ifx_getenv( "gbasedbtdir" );
/* Check if GBASEDBTDIR is set */
If( GbasedbtDirVal != NULL )
printf( "Current GBASEDBTDIR value is %\n", GbasedbtDirVal );
返回代码
ifx_getenv() 函数返回指向包含 varname 的 GBase 8s 环境表条目的指针,或返回
NULL,如果该函数在表中未找到 varname 的话。
限制:
请不要使用返回的指针来修改环境变量的值。
请改为使用 ifx_putenv() 函数。
如果 ifx_getenv() 在 GBase 8s 环境表中未找到 "varname" ,则返回值为 NULL。

SQLSpecialColumns 检索有关列的信息。
SQLSpecialColumns 检索有关指定表的以下信息:

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

l
唯一标识表中的一行的最佳列集
l
通过事务更新行中的值时,自动更新的列
下表描述了 SQLSpecialColumns 的 SQLSTATE 和错误值。
SQLSTATE
错误值
错误消息
01000
-11001
General warning
08S01
-11020
Communication-link failure
24000
-11031
Invalid cursor state
S1000
-11060
General error
S1001
-11061
Memory-allocation failure
S1008
-11065
Operation canceled
S1010
-11067
Function-sequence error
S1090
-11071
Invalid string or buffer length
S1097
-11078
Column type out of range
S1098
-11079
Scope type out of range
S1099
-11080
Nullable type out of range
S1C00
-11092
Driver not capable
S1T00
-11094
Time-out expired
S1C00
-11300
SQL_DEFAULT_PARAM not supported
08S01
-11301
A protocol error has been detected. Current connection is
closed.
S1000
-11310
Create and Drop must be executed within a ServerOnly
Connection
S1000
-11320
Syntax error
S1000
-11323
The statement contained an escape clause not supported by
this database driver