Gestion des transactions actives et préparées à l'aide de l'outil de script wsadmin
Vous pouvez utiliser l'outil de script wsadmin pour gérer des transactions actives et préparées demandant une éventuelle intervention de l'administrateur.
Avant de commencer
Pourquoi et quand exécuter cette tâche
Dans des circonstances normales, les transactions
s'exécutent et se terminent (validation ou annulation) automatiquement, sans que vous n'ayez
besoin d'intervenir. Toutefois, dans
certains cas, vous devez éventuellement résoudre manuellement une
transaction. Par exemple, vous pouvez décider d'annuler une transaction qui s'est bloquée en
interrogeant un gestionnaire de ressources dont vous savez, qu'il ne sera pas à
nouveau disponible dans les délais requis.
Dans des circonstances normales, il faut s'efforcer de terminer une transaction. Toutefois, à cause des RRS (Recovery Services)
et des contextes natifs en train de terminer, vous pouvez être dans l'impossibilité
de terminer une transaction. Dans ce cas, la transaction est marquée en rollback_only (annulation seule) pour pouvoir être annulée à la prochaine fenêtre disponible. Dans
d'autres cas, vous devez mettre fin manuellement à une transaction. Par exemple, vous pouvez décider d'arrêter une transaction qui s'est bloquée en interrogeant un gestionnaire de ressources dont vous savez, qu'il ne sera pas à nouveau disponible dans les délais requis.
Pour plus d'informations concernant les MBeans TransactionService et Transaction, voir la documentation sur l'API (Application Programming Interface).
Procédure
Exemple
Le script suivant est un exemple d'utilisation des MBeans TransactionService et Transaction pour gérer les transactions manuelles. Exécutez le script uniquement sur un serveur d'applications, et non sur le gestionnaire de déploiement ou l'agent de noeud.
# 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