Ibm mq API出口中的DB事务性

Ibm mq API出口中的DB事务性,ibm-mq,xa,Ibm Mq,Xa,声明退出功能可以在应用程序的工作单元中运行 假设应用程序启动UOW: MQPUT将消息发送到队列 在数据库的表T1中插入一条记录 此外,我们还有一个Put_Afterexit函数,它还可以在表T2中插入同一DB的记录 根据上面的链接,充当XA事务管理器的WebSphere MQ将把插入T1和T2视为单个XA事务 我的问题是,DB2会将这两个插入视为一个事务吗?插入是一个事务还是两个事务取决于它们是否都包含在相同的MQBEGIN和MQCOMMIT调用之间。这就是说,您在出口中做的越多,MQ就变

声明退出功能可以在应用程序的工作单元中运行

假设应用程序启动UOW:

  • MQPUT
    将消息发送到队列
  • 在数据库的表T1中插入一条记录
此外,我们还有一个
Put_After
exit函数,它还可以在表T2中插入同一DB的记录

根据上面的链接,充当XA事务管理器的WebSphere MQ将把插入T1和T2视为单个XA事务


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

插入是一个事务还是两个事务取决于它们是否都包含在相同的
MQBEGIN
MQCOMMIT
调用之间。这就是说,您在出口中做的越多,MQ就变得越慢、越不可靠。例如,将消息复制到另一个队列的API出口仅使用QMgr的资源

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

现在想象一下,对每个消息
PUT
GET
都这样做

此外,如果在QMgr之外执行的任何这些操作失败,它肯定会终止事务,可能会终止应用程序,并且根据
FASTPATH
和其他选项,可能会终止QMgr


将前后映像放到单独的MQ队列中,并让一个完全独立的程序将它们加载到数据库中,这将是一个更好的设计。这使得API调用在MQ中保持极快的速度。您可能只会损失50%的吞吐量,而不是80%~90%,因为每个
PUT
GET
都包含来自API出口的两个外部调用和所有网络遍历。这种将消息卸载到第二个队列以便随后上载到DB的技术实际上是发布审核消息的常用方法。

插入是一个事务还是两个事务取决于这两个事务是否包含在相同的
MQBEGIN
MQCOMMIT
调用之间。这就是说,您在出口中做的越多,MQ就变得越慢、越不可靠。例如,将消息复制到另一个队列的API出口仅使用QMgr的资源

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

现在想象一下,对每个消息
PUT
GET
都这样做

此外,如果在QMgr之外执行的任何这些操作失败,它肯定会终止事务,可能会终止应用程序,并且根据
FASTPATH
和其他选项,可能会终止QMgr


将前后映像放到单独的MQ队列中,并让一个完全独立的程序将它们加载到数据库中,这将是一个更好的设计。这使得API调用在MQ中保持极快的速度。您可能只会损失50%的吞吐量,而不是80%~90%,因为每个
PUT
GET
都包含来自API出口的两个外部调用和所有网络遍历。这种将消息卸载到第二个队列以便随后上载到DB的技术实际上是发布审核消息的常用方法。

由于某些要求,将消息异步记录到另一个队列在我们的特定情况下不起作用。不过,这是经过考虑的。从API出口写入DB的开销是已知的。MQPUT和MQGET的容量不是很大。请确保代码是线程安全的、可重入的、可靠的系统级质量,并保持足够深的工作台以维护该代码。由于某些要求,将消息异步记录到另一个队列在我们的特定情况下不起作用。不过,这是经过考虑的。从API出口写入DB的开销是已知的。MQPUT和MQGET的容量不是很大。请确保代码是线程安全的、可重入的、坚如磐石的、系统级质量的,并保持足够深的平台来维护代码。