解决不确定事务
使用此任务来解决不确定事务以及与它们相关联的消息。
关于此任务
异常情况(如移除节点的操作导致消息传递引擎被破坏)会导致事务无限期地保持不确定状态。当事务具有不确定状态时,它必须被落实或回滚以使受影响的消息传递引擎能够继续正常处理。
可以使用管理控制台来显示导致问题的消息(请参阅列示消息点上的消息)。如果有涉及不确定事务的消息,那么事务的标识将显示在与该消息相关联的面板中。然后,可以通过两种方法处理该事务:
- 使用服务器事务管理面板
- 使用消息传递引擎 MBean 上的方法
必须先尝试使用应用程序服务器的事务管理 MBean 接口来解决不确定事务。使用 wsadmin 脚本编制管理活动的和就绪的事务中对它们进行了描述。对可能协调缺省消息传递提供程序的事务(包括消息传递操作)的所有应用程序服务器使用这些脚本。如果事务管理器脚本识别事务标识,请使用这些脚本来解决事务。这将以一致方式解析全局事务中的所有资源(包括消息传递)。
如果在任何应用程序服务器上运行的事务管理器脚本不识别事务标识,或者主管事务管理器的应用程序服务器不能恢复,那么可使用 SIBMessagingEngine MBean 上的方法以独立于全局事务的方式解决事务的消息传递部分。必须手动选择落实或回滚事务。
可使用消息传递引擎 MBean 上的下列方法来获取事务标识 (XID) 列表并落实和回滚事务:
- getPreparedTransactions()
- commitPreparedTransaction(String xid)
- rollbackPreparedTransaction(String xid)
要调用方法,可使用
wsadmin 命令,例如,可使用下列形式的命令从消息传递引擎 MBean 中获取不确定事务标识列表:
wsadmin>AdminControl.invoke(AdminControl.queryNames("type=SIBMessagingEngine,*").
splitlines()[0] , "getPreparedTransactions")
另外,可以使用如下所示的脚本来调用 MBean 的方法:
import sys
mebeans=AdminControl.queryNames("type=SIBMessagingEngine,*").splitlines()
for mebean in mebeans:
input=0
meName=""
print "--- Start ME: ---------------"
print mebean
print "-----------------------------"
while input>=0:
xidList=AdminControl.invoke(mebean , "getPreparedTransactions").splitlines()
print "--- Prepared Transactions ---"
index=0
for xid in xidList:
print " Index=%s XID=%s" % (index , xid)
index+=1
print "------- End of list ---------"
print "Select index of XID to commit/rollback"
print "(or enter -1 to skip to next ME):"
input=int(sys.stdin.readline().strip())
if input<0:
print "No index selected."
else:
xid=xidList[input]
print "Enter c to commit or r to rollback XID %s" % xid
input=sys.stdin.readline().strip()
if input=="c":
print "Committing xid=%s" % xid
AdminControl.invoke(mebean , "commitPreparedTransaction" , xid)
if input=="r":
print "Rolling back xid=%s" % xid
AdminControl.invoke(mebean , "rollbackPreparedTransaction" , xid)
print
print "--- End ME --------------------"
print
print "No more ME definitions found, exiting"
此脚本列示事务的事务标识以及索引。于是,您可以选择索引并落实或回滚与该索引相对应的事务。