You can use wsadmin scripting to manage active and prepared transactions that might need administrator action.
In normal
circumstances, transactions
should run and complete (commit or roll back) automatically, without
the need for intervention. However, in some circumstances, you might
have to resolve a transaction manually. For example, you might want
to roll back a transaction that is stuck polling a resource manager
that you know will not become available again in the required time
frame.
For more information about the TransactionService and Transaction MBeans, see the application programming interface (API) documentation.
The following script is an example of how to use the TransactionService and Transaction MBeans to work with manual transactions. Run the script only against an application server, and not against the deployment manager or node agent.
# 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 " "
}
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