02089, 00000, "COMMIT is not allowed in a subordinate session"
// *Cause: COMMIT was issued in a session that is not the two-phase commit
// global coordinator.
// *Action: Issue commit at the global coordinator only.
在tpcall 一个服务中,如果单独的commit , 回报2089的错误;
在网上找了一下资料,基本上很难实现在不建立新数据连接的情况下,提交已经做的修改。
解决方法找到了三个:
1. 在程序中断掉原来的数据库连接, 建立新的连接。
这种情况有很多问题,断开的时候如果提交的话,不能提交成功,所以可能会把原来的提交回滚。自己一定要管理号对事物的控制,高手能用!
2.在服务中tpcall 一个new service, tpcall 一个新的服务,这种会包括建立数据库的连接, 事务控制,这是一个中很好理解,很好的方法,很多人都是用的这种方法。
tpcall ---》service_A -----》tpcall sevice_B ( select updae , insert delete commit , exit) --- >service A -----> ok
3. 在网上还搜到了一个新的方法,
仍然是建立新的数据库连接,不过在建立新的连接的时候指定子标识符号
EXEC SQL CONNECT :h_sqlusr IDENTIFIED BY :h_sqlpwd AT :h_conn USING :h_sid;
AT 指定子标识符号!
在更新,EXEC SQL At :newLink
update tb_tablea
EXEC SQL At :newLink INSERT
EXEC SQL At :newLink DELETE
提交:
EXEC SQL AT :newLink COMMIT ;
or
EXEC SQL AT :newLink COMMIT WORK RELEASE;
回滚:
EXEC SQL AT :newLink rollback WORK RELEASE;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21634752/viewspace-670292/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21634752/viewspace-670292/