更新时间:2026-07-28 GMT+08:00
使用XA接口
此示例为XA接口使用。在编译时需要动态链接gsxalib库。
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpq-fe.h>
#include <xa.h>
void execute_query(PGconn *conn, const char *query) {
PGresult *res = PQexec(conn, query);
if (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, "Query execution failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
PQclear(res);
}
int main(int argc, char **argv)
{
char xa_info[256] = {0};
int rmid = 1;
XID xid;
int ret = 0;
PGconn *conn = NULL;
/* 此处user、passwd等变量应从环境变量或配置文件读取,环境变量需用户自己按需配置;非环境变量情况下可直接赋值字符串 */
char *passwd = getenv("EXAMPLE_PASSWD_ENV");
char *port = getenv("EXAMPLE_PORT_ENV");
char *host = getenv("EXAMPLE_HOST_ENV");
char *username = getenv("EXAMPLE_USERNAME_ENV");
char *dbname = getenv("EXAMPLE_DBNAME_ENV");
sprintf(xa_info, "dbname=%s port=%s host=%s user=%s password=%s", dbname, port, host, username, passwd);
// Init XID structure
memset(&xid, 0, sizeof(XID));
xid.formatID = 12345;
xid.gtrid_length = 4;
xid.bqual_length = 4;
memcpy(xid.data, "GID1", xid.gtrid_length);
memcpy(xid.data + xid.gtrid_length, "BID1", xid.bqual_length);
ret = xagsw.xa_open_entry(xa_info, rmid, TMNOFLAGS);
if (ret != XA_OK) {
fprintf(stderr, "xa_open_entry failed, code:%d.\n", ret);
}
conn = get_xapg_conn(rmid);
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn));
}
ret = xagsw.xa_start_entry(&xid, rmid, TMNOFLAGS);
if (ret != XA_OK) {
fprintf(stderr, "xa_start_entry failed, code:%d.\n", ret);
}
// Perform operations
execute_query(conn, "drop table if exists test_xa;CREATE TABLE test_xa (i int4, t text);");
execute_query(conn, "INSERT INTO test_xa values (1, 'ho there');");
ret = xagsw.xa_end_entry(&xid, rmid, TMSUCCESS);
if (ret != XA_OK) {
fprintf(stderr, "xa_end_entry failed, code:%d.\n", ret);
}
ret = xagsw.xa_prepare_entry(&xid, rmid, TMNOFLAGS);
if (ret != XA_OK) {
fprintf(stderr, "xa_prepare_entry failed, code:%d.\n", ret);
}
XID xids[10] = {0};
int count = xagsw.xa_recover_entry(xids, 10, rmid, TMNOFLAGS);
if (count < 0) {
fprintf(stderr, "xa_recover_entry failed, code:%d.\n", count);
} else {
for (int i = 0; i < count; ++i) {
printf("xid%d [formatID]:%d [gtrid_length]:%d [bqual_length]:%d [data]:%s\n",
i,
xids[i].formatID,
xids[i].gtrid_length,
xids[i].bqual_length,
xids[i].data);
}
}
ret = xagsw.xa_commit_entry(&xid, rmid, TMNOFLAGS);
if (ret != XA_OK) {
fprintf(stderr, "xa_commit_entry failed, code:%d.\n", ret);
}
ret = xagsw.xa_close_entry(xa_info, rmid, TMNOFLAGS);
if (ret != XA_OK) {
fprintf(stderr, "xa_commit_entry failed, code:%d.\n", ret);
}
printf("All things done successfully.\n");
return 0;
} 示例运行结果如下:
NOTICE: table "test_xa" does not exist, skipping xid0 [formatID]:12345 [gtrid_length]:4 [bqual_length]:4 [data]:GID1BID1 All things done successfully.
父主题: 典型应用开发示例