返回首页

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

更新日期:2024年09月11日

| Max
| 86.0 |

#define GCI_BIND_ERROR
1001
#define GCI_DEFINE_ERROR
1002
#define GCI_ATTRGET_ERROR
1003
#define GCI_ATTRSET_ERROR
1004
#define GCI_HANDLEALLOC_ERROR
1005
#define GCI_HANDLEFREE_ERROR
1006
#define GCI_ENVCREATE_ERROR
1007
#define GCI_LOGONNODB_ERROR
1009
#define GCI_LOGOFF_ERROR
1010
#define GCI_SERVERATTACH_ERROR
1011
#define GCI_SESSIONEND_ERROR
28
#define GCI_SESSIONBEGIN_ERROR
1013
#define GCI_SERVERVERSION_ERROR
1008
#define GCI_TRANSCOMMIT_ERROR
1015
#define GCI_TRANSSTART_ERROR
1016
#define GCI_TRANSROLLBACK_ERROR
1017
#define GCI_STMTPREPARE_ERROR
1018
#define GCI_STMTEXECUTE_ERROR
1019
#define GCI_STMTFETCH_ERROR
1020
#define GCI_DESCALLOC_ERROR
1021
#define GCI_DESCFREE_ERROR
1022
#define GCI_PARAMGET_ERROR
1023
#define GCI_PARAMSET_ERROR
1024
#define GCI_DESCANY_ERROR
1025
#define GCI_DIRPATH_LOADSTREAM_ERROR
1026
#define GCI_LOB_GETLENGTH_ERROR
1027
#define GCI_LOB_READ_ERROR
1028
#define GCI_LOG_WRITE_ERROR
1029
#define GCI_LOG_PROCDESC_ERROR
1030
#define GCI_DB_CONNECT_ERROR
3114
#define GCI_NOT_LOGGED_ON
1012
#define GCI_SHUTDOWN_IN_PROGRESS
1014
#define GCI_DATETIME_CONVERT
1040

注:当厂家设置为3时, 错误码设置为数据库返回的错误码。

1)新增错误消息, 指示函数执行过程中遇到的错误详细信息。如:

"ERROR: [GCI-21560][GCI Driver].parameter %d is NULL\n"

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 125
"ERROR: [GCI-1846][GCI Driver].week format is invalid \n"
"ERROR: [GCI-11104][GCI Driver].date format is invalid\n"
"ERROR: [GCI-11105][GCI Driver].type is invalid\n"
"ERROR: [GCI-21405][GCI Driver].type is diff\n"
"ERROR: [GCI-11107][GCI Driver].get year month fun err\n"
"ERROR: [GCI-11108][GCI Driver]. get day second fun err \n"
2)新增日期类型的错误定义,指示日期值的错误之处。


#define GCI_DATE_INVALID_DAY
0x1
/* Bad DAy */
#define GCI_DATE_INVALID_MONTH
0x4
/* Bad MOnth */
#define GCI_DATE_INVALID_YEAR
0x10
/* Bad YeaR */
#define GCI_DATE_INVALID_HOUR
0x40
/* Bad HouR */
#define GCI_DATE_INVALID_MINUTE
0x100
/* Bad MiNute */
#define GCI_DATE_INVALID_SECOND
0x400
/* Bad SeCond */
#define GCI_DATE_YEAR_ZERO
0x2000
/* Year may not equal zero
*/
#define GCI_DATE_INVALID_FORMAT 0x8000 /* Bad date format input */
3)新增日期时间类型的错误定义,指示日期时间值的错误之处。


#define
GCI_DT_INVALID_DAY
0x1
/* Bad day */
#define
GCI_DT_INVALID_MONTH
0x4
/* Bad MOnth */
#define
GCI_DT_INVALID_YEAR
0x10
/* Bad YeaR */
#define
GCI_DT_INVALID_HOUR
0x40
/* Bad HouR */
#define
GCI_DT_INVALID_MINUTE
0x100
/* Bad MiNute */
#define
GCI_DT_INVALID_SECOND
0x400
/* Bad SeCond */
#define
GCI_DT_INVALID_FRACCTION
0x800

#define
GCI_DT_YEAR_ZERO
0x2000
/* Year may not equal zero */
#define
GCI_DT_INVALID_FORMAT
0x8000
/* Bad date format input */
4)新增时间间隔类型的错误定义,指示时间间隔值的错误之处。
#define GCI_INTER_INVALID_DAY 0x1 /* Bad day */
#define GCI_INTER_INVALID_MONTH
0x4
/* Bad MOnth */
#define GCI_INTER_INVALID_HOUR
0x40
/* Bad HouR */
#define GCI_INTER_INVALID_MINUTE
0x100
/* Bad MiNute */
#define GCI_INTER_INVALID_SECOND
0x400
/* Bad SeCond */
#define GCI_INTER_INVALID_FRACSEC
0x1000
/* Bad Fractional second */

术语“异类环境”在用于 GBase 8s 数据库服务器环境中时,是指其中至少有一个数据库服
务器不是 GBase 8s 数据库服务器的数据库服务器组。异类落实可确保异类环境中分布式事
务的全有或全无的基础。
与两阶段落实协议不同,
异类落实协议支持非 GBase 8s 参与者的参与。
非 GBase 8s 参与
者(称为网关参与者)必须通过 GBase 8s 网关与协调者通信。
当满足了以下条件时,数据库服务器将使用异类落实协议:

异类落实已启用。(即,HETERO_COMMIT 配置参数设置为 1。)

落实的协调者是 GBase 8s。

非 GBase 8s 参与者通过 GBase 8s 网关与 GBase 8s 数据库服务器通信。

在单个事务中至多有一个非 GBase 8s 参与者执行更新。
下图说明了此场景。
图: 需要对分布式事务执行异类落实的配置

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 516 -


可参与异类落实事务的网关
网关充当 GBase 8s 应用程序(在本例中是数据库服务器)和非 GBase 8s 数据库服务器之
间的桥梁。
可使用网关将 GBase 8s 应用程序用于访问和修改存储非 GBase 8s 数据库中存储
的数据。
下表列出了可参与某事务(数据库服务器在该事务中使用异类落实协议)的网关和相应的
数据库服务器。
表 1. 网关和相应的数据库服务器/异类落实事务
网关
数据库服务器
GBase 8s Enterprise Gateway with DRDA
GBase DB2
®、OS/400
® 和 SQL/DS™
GBase 8s Enterprise Gateway for EDA/SQL
EDA/SQL
GBase 8s Enterprise Gateway Manager
任何具有 ODBC 连接的数据库服务

启用和禁用异类落实
使用文本编辑器来更改启用或禁用异类落实的 HETERO_COMMIT 配置参数:
此更改在关
闭并重新启动数据库服务器后生效。
使用文本编辑器或 ISA 来更改启用或禁用异类落实的 HETERO_COMMIT 配置参数:更
改的关闭并重新启动数据库服务器后生效。
如果将 HETERO_COMMIT 设置为 1,事务协调者会检查是否有需要使用异类落实的分布
式事务。当协调者检测到这类事务,它会自动执行异类落实协议。
如果将 HETERO_COMMIT 设置为 0 或任何非 1 的数字,
那么事务协调者将禁用异类落实
协议。 下表总结事务协调者为确保分布式事务的完整性而使用哪一协议(异类落实还是两
阶段落实)。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 517 -
HETERO_COMMIT 设置
网关参与者是否已更新
数据库服务器协议
已禁用

两阶段落实
已禁用

两阶段落实
已启用

两阶段落实
已启用

异类落实
异类落实的工作原理
异类落实协议是标准两阶段落实协议的修改版本。异类落实协议中的后决策阶段与两阶段
落实协议的后决策阶段相同。预落实阶段则包含一处轻微修改,并且向异类落实协议添加
了称为网关落实阶段的新阶段。
以下主题解释了对预落实阶段和网关落实阶段的修改。有关后决策阶段的详细说明,请参
阅后决策阶段。
预落实阶段
协调者指导每个更新参与者(网关参与者除外)准备落实事务。
如果更新满足了所有延迟的约束,那么所有参与者(网关参与者除外)会将指示其可以提
交各自的工作片段的消息返回至协调者。
网关落实阶段
如果所有参与者均成功返回了指示其已准备好落实的消息,那么协调者将落实消息发送至
网关。接着,网关会将指示网关是否已落实它这部分事务的响应发送至协调者。如果网关
落实了事务,协调者会决定落实整个事务。下图说明了此过程。
图: 生成已落实事务的异类落实阶段

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 518 -

如上图所示,如果网关未能落实事务,那么协调者将回滚整个事务。
异类落实优化
当唯一接收更新的参与者是非 GBase 8s 数据库时,数据库服务器将优化异类落实协议。
在这种情况下,
协调者将在不调用异类落实协议的情况下向所有参与者发送一条落实消息。

失败异类落实的含意
在分布式事务期间,任何时候数据库服务器使用异类落实进行处理,协调者或任意数目的
参与者都可能发生故障。数据库服务器用与两阶段落实协议中所使用方法相同的方法来处
理这些故障,但某些情况除外。以下主题详细分析了这些特殊情况。
数据库服务器协调者故障
协调者发生故障后数据的一致性取决于异类落实过程中协调者发生故障的时刻。如果协调
者在向网关发送落实消息之前发生故障,那么一旦恢复后就停止整个事务,这与两阶段落
实的情况相同。
如果协调者在写入落实日志记录之后发生故障,那么一旦恢复后就成功落实整个事务,这
与两阶段落实的情况相同。
如果协调者在向网关发送落实消息之后但在写入落实日志记录之前发生故障,那么一旦恢
复,事务中的远程 GBase 8s 数据库服务器站点将停止。如果网关接收到落实消息并落实了
事务,那么这种情况可能会导致不一致。
下表总结了这些应用场合。
数据库服务器协调者发生故障的时间点
预期结果
在协调者写入 PREPARE 日志记录之后,但在网
关落实阶段之前
维持了数据一致性。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 519 -
数据库服务器协调者发生故障的时间点
预期结果
在协调者向网关发送落实消息之后,
但在它接收
到答复之前
数据有可能不一致。
协调者没有指示有可
能数据不一致。
在网关落实阶段之后,
但在协调者向逻辑日志写
入 COMMIT 记录之前
失去数据一致性。
协调者没有指示数据不
一致。
参与者故障
无论何时使用异类协议的分布式事务中的参与者发生故障,
协调者都将发送以下错误消息:

-441 Possible inconsistent data at the target DBMS name due to an aborted
commit.
此外,数据库服务器还向消息日志发送以下消息:
Data source accessed using gateway name might be in an inconsistent state.
参与者故障并不限于数据库服务器或网关的故障。此外,协调者和网关之间的通信链接的
故障被认为是网关故障。如果发生链接故障,那么网关将终止。网关必定会终止,因为它
没有保留事务日志,因此无法重新建立与协调者的连接并重新开始事务。由于这种限制,
所以存在一些应用场合,在这些应用场合中网关故障可能使数据处于不一致状态。 下表总
结了这些应用场合。
参与者发生故障的时间点
预期结果
在参与者接收到来自协调者的落实事务消息
之后,但在参与者执行落实之前
维持了数据一致性。
在参与者接收到来自协调者的落实事务消息
并落实了事务之后,但在参与者回复协调者
之前
数据不一致。
在参与者落实事务并向协调者发送回复之后 如果在协调者接收到回复之前通信链接发生
故障,那么数据不一致。如果协调者接收到
回复,那么数据是一致的(前提是协调者在
写入 COMMIT 记录之前没有发生故障)。
当参与者发生故障时数据库服务器所遵循的恢复过程与两阶段落实中所遵循的过程相同。
有关此过程的更多信息,请参阅两阶段落实协议如何处理故障。
异类落实错误消息的解释

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 520 -
当数据库服务器未能使用异类落实来处理分布式事务时,它将返回以下主题中说明的两个
错误消息之一。
应用程序尝试更新多个网关参与者
当 HETERO_COMMIT 设置为 1 时,
如果您的客户机应用程序尝试在多个网关参与者上更
新数据,那么协调者将返回以下错误消息:
-440 Cannot update more than one non-Gbasedbt DBMS within a transaction.
如果您接收到该错误消息,可重写该违规的应用程序,以使它在单个分布式事务中至多更
新一个网关参与者。
尝试使用异类落实来落实分布式事务失败
数据库服务器有可能因为以下一个或多个原因而导致在使用异类协议时未能落实分布式事
务:

通信错误

站点故障

网关故障

其他未知错误
当发生这类故障时,协调者将返回以下消息:
-441 Possible inconsistent data at the target DBMS name due to an aborted
commit.
在数据库服务器发送该消息后,它会回滚所有正在参与事务的更新站点,但网关参与者站
点上完成的工作有可能出现异常。 如果故障发生在网关参与者处理落实消息之后,那么网
关参与者可能已落实其更新。如果网关参与者落实了更新,您必须手动回滚这些更新。