You can use scripting to manage active and prepared transactions that might need administrator action.
Under normal circumstances,
transactions should run and complete (commit or rollback) automatically, without
the need for intervention. However, in some circumstances, you might need
to resolve a transaction manually. For example, you might want to rollback
a transaction that has become stuck polling a resource manager that you know
will not become available again within the desired timeframe.
Under
normal circumstances, every effort is made to finish a transaction. However,
due to RRS and native contexts finishing, finishing the transaction may not
be possible. In this case, the transaction is marked rollback_only so that
it rolls back at the next available window. In other situations, you might
need to finish a transaction manually. For example, you might want to finish
a transaction that has become stuck polling a resource manager that you know
will not become available again within the desired timeframe.
The TransactionService Managed Bean (MBean), see API documentation - Application programming interfaces (package: Public MBean Interfaces, class: TransactionService), is used to list transactions in various states by invoking one of the following methods:
Each entry in the returned list contains the following attributes:
The TransactionService MBean, see API documentation - Application programming interfaces (package: Public MBean Interfaces, class: TransactionService), can also used to gather more information about the properties of the transaction service, by obtaining the following attributes:
The Transaction MBean, see API documentation - Application programming interfaces (package: Public MBean Interfaces, class: Transaction), can be used to commit, rollback, finish or remove from the list of heuristically completed transactions depending on the transaction's state, by invoking one of the following methods:
The Transaction MBean, see API documentation - Application programming interfaces (package: Public MBean Interfaces, class: Transaction), can also be used to gather more information about a transaction, by invoking the following methods:
The following script is an example of how to use the TransactionService MBean and Transaction MBean. The script should only be executed against an application server, and not against the deployment manager or node agent.
Working with manual transactions: example jacl script.
# get the TransactionService MBean set servicembean [$AdminControl queryNames type=TransactionService,*] # get the Transaction MBean set mbean [$AdminControl queryNames type=Transaction,*] set input 0 while {$input >= 0} { # invoke the listManualTransactions method set tranManualList [$AdminControl invoke $servicembean listManualTransactions] if {[llength $tranManualList] > 0} { puts "----Manual Transaction details---------------" set index 0 foreach tran $tranManualList { puts " Index= $index tran= $tran" incr index } puts "----End of Manual Transactions ---------------" puts "Select index of transaction to commit/rollback:" set input [gets stdin] if {$input < 0} { puts "No index selected, exiting." } else { set tran [lindex $tranManualList $input] set commaPos [expr [string first "," $tran ]-1] set localTID [string range $tran 0 $commaPos] puts "Enter c to commit or r to rollback Transaction $localTID" set input [gets stdin] if {$input=="c"} { puts "Committing transaction=$localTID" $AdminControl invoke $mbean commit $localTID } if {$input=="r"} { puts "Rolling back transaction=$localTID" $AdminControl invoke $mbean rollback $localTID } } } else { puts "No Manual transactions found, exiting" set input -1 } puts " " }
Working with manual transactions: example Jython script.
import sys def wsadminToList(inStr): outList=[] if (len(inStr)>0 and inStr[0]=='[' and inStr[-1]==']'): tmpList = inStr[1:-1].split(" ") else: tmpList = inStr.split("\n") #splits for Windows or Linux for item in tmpList: item = item.rstrip(); #removes any Windows "\r" if (len(item)>0): outList.append(item) return outList #endDef servicembean = AdminControl.queryNames("type=TransactionService,*" ) mbean = AdminControl.queryNames("type=Transaction,*" ) input = 0 while (input >= 0): tranList = wsadminToList(AdminControl.invoke(servicembean, "listManualTransactions" )) tranLength = len(tranList) if (tranLength > 0): print "----Manual Transaction details---------------" index = 0 for tran in tranList: print " Index=" , index , " tran=" , tran index = index+1 #endFor print "----End of Manual Transactions ---------------" print "Select index of transaction to commit/rollback:" input = sys.stdin.readline().strip() if (input == ""): print "No index selected, exiting." input = -1 else: tran = tranList[int(input)] commaPos = (tran.find(",") -1) localTID = tran[0:commaPos+1] print "Enter c to commit or r to rollback transaction ", localTID input = sys.stdin.readline().strip() if (input == "c"): print "Committing transaction=", localTID AdminControl.invoke(mbean, "commit", localTID ) #endIf elif (input == "r"): print "Rolling back transaction=", localTID AdminControl.invoke(mbean, "rollback", localTID ) #endIf else: input = -1 #endelse #endElse else: print "No transactions found, exiting" input = -1 #endElse print " " #endWhile
In this information ... | IBM Redbooks, demos, education, and more |