Aktive und vorbereitete Transaktionen mit wsadmin-Scripting verwalten
Sie können wsadmin-Scripting verwenden, um aktive und vorbereitete Transaktionen zu verwalten, die unter Umständen eine Administratoraktion erfordern.
Vorbereitende Schritte
Informationen zu diesem Vorgang
Normalerweise sollten Transaktionen automatisch ausgeführt und abgeschlossen werden
(COMMIT- oder ROLLBACK-Operation), ohne dass ein Benutzereingriff erforderlich ist. Unter bestimmten Umständen kann es jedoch
erforderlich sein, eine Transaktion manuell aufzulösen. Dies könnte für eine Transaktion ratsam sein,
die zurückgesetzt werden soll, weil sie Aufrufe an einen Ressourcenmanager richtet, von dem Sie wissen, dass er nicht innerhalb des erforderlichen Zeitraums
verfügbar sein wird.
Unter normalen Umständen
wird alles versucht, um eine Transaktion zu beenden. Wegen der Resource Recovery
Services (RRS) und der Fertigstellung nativer Kontexte ist es möglicherweise nicht möglich, die Transaktion zu beenden.
In einem solchen Fall wird die Transaktion mit rollback_only markiert, damit sie im nächsten verfügbaren
Fenster zurückgesetzt werden kann. Es gibt auch Fälle, in denen Sie eine
Transaktion manuell beenden müssen. Dies könnte für eine Transaktion ratsam sein,
die beendet werden soll, weil sie Aufrufe an einen Ressourcenmanager richtet, von dem Sie wissen, dass er nicht innerhalb des erforderlichen Zeitraums
verfügbar sein wird.
Weitere Informationen zum TransactionService und zu Transaction-MBeans finden Sie in der API-Dokumentation.
Vorgehensweise
Beispiel
Das folgende Beispielscript veranschaulicht die Verwendung der MBeans "TransactionService" und "Transaction" für manuelle Transaktionen. Führen Sie das Script nur für einen Anwendungsserver und nicht für den Deployment Manager oder Node Agent aus.
# MBean "Transaction" abrufen
set servicembean [$AdminControl queryNames type=TransactionService,*]
# MBean "Transaction" abrufen
set mbean [$AdminControl queryNames type=Transaction,*]
set input 0
while {$input >= 0} {
# die Methode listManualTransactions aufrufen
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