API出口中的数据库事务性

时间:2015-09-01 05:14:39

标签: ibm-mq xa

This link表示退出功能可以在应用程序的工作单元中运行。

想象一下应用程序启动UOW:

  • MQPUT向队列发送消息
  • 在数据库的表T1中插入记录

此外,我们还有一个Put_After退出函数,它也会在同一个数据库的表T2中插入一条记录。

根据上述链接WebSphere MQ充当XA事务管理器,将插入T1和T2作为单个XA事务。

我的问题是,DB2会将这两个插入视为单个事务吗?

1 个答案:

答案 0 :(得分:0)

插入是一个还是两个事务取决于两者是否包含在相同的MQBEGINMQCOMMIT调用之间。也就是说,你在退出中做的越多,那就越慢,而且可靠性越低。例如,将消息复制到另一个队列的API出口仅使用QMgr的资源。

然而,调用数据库的API出口遍历网络,可能包括DNS查找的延迟,创建TLS会话(假设数据库凭据保持私有),对数据库进行身份验证和登录,发出XA PREPARE语句和其他XA协议执行任何插入,然后发出COMMIT和XA事务完成。

现在想象一下 每条 消息PUTGET

此外,如果从QMgr发生的任何这些操作失败,它肯定会杀死事务,可能会杀死应用程序,并且取决于FASTPATH和其他选项,可能会破坏QMgr。

将前/后映像放入单独的MQ队列,并将完全独立的程序加载到DB中,这将是一个 很多 更好的设计。这使得API调用保持在MQ中非常快。您可能只丢失50%的吞吐量而不是80%~90%,因为每个PUTGET需要从API出口和所有网络遍历进行两次外部调用。这种将消息卸载到第二个队列以便后续上传到数据库的技术实际上是发布审计消息的常用方法。