Gerenciando Transações Ativas e Preparadas Usando o Script wsadmin
É possível usar o script wsadmin para gerenciar transações ativas e preparadas que podem precisar de ação do administrador.
Antes de Iniciar
Sobre Esta Tarefa
Em circunstâncias normais, as transações
devem ser executadas e concluídas (confirmadas ou recuperadas) automaticamente, sem a necessidade
de intervenção. No entanto, em algumas circunstâncias, pode ser necessário
resolver uma transação manualmente. Por exemplo, é possível retroceder uma transação
que ficou bloqueada durante a sondagem de um gerenciador de recursos
que você sabe que não ficará disponível novamente no intervalo de tempo necessário.
Em circunstâncias normais,
todo esforço será feito para concluir uma transação. No entanto, devido à conclusão de Resource Recovery
Services (RRS) e de contextos nativos, pode não ser possível
concluir a transação. Neste caso, a transação é marcada como rollback_only
para que seja retrocedida na próxima janela disponível. Em outras situações, pode ser necessário
concluir uma transação manualmente. Por exemplo, é possível concluir uma transação
que ficou bloqueada durante a sondagem de um gerenciador de recursos
que você sabe que não ficará disponível novamente no intervalo de tempo necessário.
Para obter informações adicionais sobre os MBeans TransactionService e Transaction, consulte a documentação da interface de programação de aplicativos (API).
Procedimento
Exemplo
O script a seguir é um exemplo de como usar os MBeans TransactionService e Transaction para trabalhar com transações manuais. Execute o script apenas em um servidor de aplicativos e não no gerenciador de implementação ou no agente do nó.
# get the TransactionService MBean
set servicembean [$AdminControl queryNames type=TransactionService,*]
# obter o MBean Transaction
set mbean [$AdminControl queryNames type=Transaction,*]
set input 0
while {$input >= 0} {
# chamar o método listManualTransactions
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 para Windows ou Linux
for item in tmpList:
item = item.rstrip(); #remove todo "\r" do Windows
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