Gestión de transacciones activas y preparadas mediante scripts wsadmin
Puede utilizar los scripts wsadmin para gestionar transacciones activas y preparadas que podrían necesitar la acción del administrador.
Antes de empezar
Acerca de esta tarea
En circunstancias normales, las transacciones
deberían ejecutarse y finalizar (confirmarse o retrotraerse) automáticamente, sin que
tenga que intervenir. No obstante, en algunas circunstancias, es posible que
tenga que resolver las transacciones manualmente. Por ejemplo, puede retrotraer
una transacción que se ha atascado al sondear un gestor de recursos que sabe
que no volverá a estar disponible dentro de la franja de tiempo necesaria.
En circunstancias normales, se realizan todos los esfuerzos necesarios para finalizar la transacción. No obstante, debido a la terminación de contextos nativos y los servicios de
recuperación de recursos (RRS), es posible que no se pueda finalizar la
transacción. En este caso, se marca la transacción como
rollback_only de modo que se retrotraiga en la siguiente
ventana disponible. En otras situaciones, es posible que necesite finalizar las
transacciones manualmente. Por ejemplo, es posible que desee finalizar una
transacción que se ha atascado al sondear un gestor de recursos que sabe que no
volverá a estar disponible dentro de la franja de tiempo necesaria.
Para obtener más información sobre los MBeans TransactionService y Transaction, consulte la documentación de la interfaz de programación de aplicaciones (API).
Procedimiento
Ejemplo
El siguiente script es un ejemplo de cómo se utilizan los MBean TransactionService y Transaction en transacciones manuales. Ejecute el script sólo en un servidor de aplicaciones y no en el gestor de despliegue ni en el agente de nodos.
# 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