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 comenzar

Antes de iniciar esta tarea, debe ejecutarse el cliente de scripts wsadmin.

Acerca de esta tarea

[AIX Solaris HP-UX Linux Windows][IBM i]En circunstancias normales, las transacciones se deben ejecutar y completar (confirmar o retrotraer) automáticamente, sin necesidad de intervención. 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.

Nota: Si opta por completar una transacción en un servidor de aplicaciones, se registra como completada en los registros de servicio de transacciones para dicho servidor, por lo que no es apta para la recuperación durante el inicio del servidor. Si completa una transacción, deberá borrar cualquier transacción dudosa en los gestores de recursos afectados.

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

  • Puede utilizar el bean gestionado (MBean) TransactionService para enumerar las transacciones en diversos estados; para ello, invoque uno de los métodos siguientes:
    listOfTransactions
    Enumera todas las transacciones no completadas. Nunca intente alterar el estado de las transacciones activas, por ejemplo, confirmando o retrotrayéndolas.
    listManualTransactions
    Enumera las transacciones a la espera de la finalización administrativa. Puede confirmar o retrotraer las transacciones en este estado.
    listRetryTransactions
    Enumera las transacciones con algunos recursos que se están reintentando. Puede finalizar (abandonar el reintento) las transacciones en este estado.
    listHeuristicTransactions
    Enumera las transacciones que se han completado de forma heurística. Puede borrar estas transacciones de la lista.
    listImportedPreparedTransactions
    Lista las transacciones que se han importado y preparado pero que aún no se han confirmado. Puede confirmar o retrotraer las transacciones en este estado.

    Cada entrada de la lista devuelta contiene los siguientes atributos:

    • Local Transaction Identifier
    • Status, que se puede interpretar llamando a getPrintableStatus en el MBean de transacción.
    • Global Transaction Identifier
    • Heuristic Outcome, que puede tomar uno de los valores siguientes:
      • 8 (HEURISTIC_COMMIT)
      • 9 (HEURISTIC_ROLLBACK)
      • 10 (HEURISTIC_MIXED)
      • 11 (HEURISTIC_HAZARD)
  • Puede utilizar el MBean TransactionService para reunir más información sobre las propiedades del servicio de transacciones, mediante la obtención de los atributos siguientes:
    transactionLogDirectory
    Directorio de este servidor donde el servicio de transacciones almacena los archivos de registros cronológicos para la recuperación.
    totalTranLifetimeTimeout
    Especifica el tiempo máximo, en segundos, permitido para una transacción que se inicia en este servidor antes de que el servicio de transacciones empiece a agotar el tiempo de espera. Las transacciones que no empiezan el proceso de finalización antes de que se produzca el tiempo de espera se retrotraen. Este valor se aplica sólo a los beans de transacciones gestionadas por contenedor (CMT).
    asyncResponseTimeout
    Tiempo, en segundos, durante el que el servidor espera una respuesta de entrada del protocolo WS-AT (Web Services Atomic Transaction) antes de enviar de nuevo el mensaje del protocolo WS-AT anterior.
    enableFileLocking
    Especifica si está habilitado el uso de bloqueos de archivos cuando se abre el registro cronológico de recuperación del servicio de transacciones.
    enableProtocolSecurity
    Especifica si está habilitado el intercambio seguro de mensajes de protocolo del servicio de transacciones.
    clientInactivityTimeout
    Intervalo máximo de tiempo en segundos entre solicitudes de transacciones de un cliente remoto. Cualquier periodo de inactividad del cliente que exceda este tiempo de espera, provoca que la transacción se retrotraiga en este servidor de aplicaciones.
    heuristicRetryLimit
    Número de veces que el servidor de aplicaciones intenta una señal de finalización, como una confirmación o una retrotracción. Los reintentos se producen después de una excepción temporal de un gestor de recursos o un socio remoto, o si se excede el tiempo de espera de respuesta asíncrona configurado antes de que todos los socios de WS-AT (Web Services Atomic Transaction) hayan respondido.
    heuristicRetryWait
    Número de segundos que el servidor de aplicaciones espera antes de reintentar una señal de finalización, como una confirmación o una retrotracción, después de producirse una excepción transitoria de un gestor de recursos o asociado remoto.
    propogatedOrBMTTranLifetimeTimeout
    Límite máximo del tiempo de espera de transacción, en segundos, para transacciones que se ejecutan en este escenario. Este valor debe ser mayor o igual que el tiempo de espera total de la transacción.
    LPSHeuristicCompletion
    Acción que se utiliza para completar una transacción que tiene un resultado heurístico. El servidor de aplicaciones confirma o retrotrae la transacción, o bien el administrador debe completar manualmente la transacción.
  • Puede utilizar el MBean Transaction para confirmar, retrotraer o finalizar una transacción, o eliminarla de la lista de transacciones completadas de forma heurística, en función del estado de la transacción, al invocar uno de los métodos siguientes:
    commit
    Confirma la transacción de forma heurística.
    rollback
    Retrotrae la transacción de forma heurística.
    finish
    Deja de reintentar los recursos de la transacción.
    removeHeuristic
    Borra la transacción de la lista.
  • Puede utilizar el MBean Transaction para reunir más información sobre una transacción, al invocar los métodos siguientes:
    getPrintableStatus
    Devuelve el estado de la transacción.
    getGlobalTranName
    Obtiene el identificador global de la transacción.
    listResources
    Lista los recursos de la transacción.

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.

Ejemplo de script con Jacl:
# 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 " "

}

Ejemplo de script con Jython:
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