2010-11-24 9 views
3

Ich habe einen Code für jta transcations wie folgt:jta transcations

try{ 
    //start jta user transcation utx 


//commit utx 

}catch(Exception ex){ 
    try{ 
    //rollback utx 
    }catch(Exception){ 
    //print error "cannot rollback 
    } 
} 
finally{ 
    if(null != utx && utx.getStatus() == Status.STATUS_ACTIVE){ 
        utx.commit(); 
    } 
} 

ich nicht verstehen, warum bin utx in schließlich verpflichtet ist?

Antwort

4

Der Commit in finally Block wird nur aufgerufen, wenn der Transaktionsstatus STATUS_ACTIVE lautet, was bedeutet, dass weder ein Commit noch ein Rollback stattgefunden hat. Es sieht wie eine Sicherheit aus, um sicherzustellen, dass die Transaktion am Ende der Methode entweder zurückgesetzt oder festgeschrieben wird, falls utx.commit() in der Methode try block vergessen wurde.

+0

Dank: u kann mir bitte sagen, was den Zustand der transcation nach Rollback sein wird und nach begehen Kann ich den Code überspringen in finally-Block, wie ich utx.commit in Versuch und utx haben in? Fang? – Sanket

+0

Es ist in der Javadoc dokumentiert: http://download.oracle.com/javaee/6/api/javax/transaction/Status.html – Guillaume

+0

Ich sah dieses Dokument es heißt "Eine Transaktion ist mit dem Zielobjekt und es verbunden befindet sich im aktiven Status. Eine Implementierung gibt diesen Status zurück, nachdem eine Transaktion gestartet wurde und bevor ein Koordinator irgendwelche Vorbereitungen trifft, es sei denn, die Transaktion wurde für Rollback markiert. "Ich erhalte nicht den Übertragungsstatus nach dem Festschreiben – Sanket

1

Ich würde sagen, es ist keine gute Praxis, solche Commit im finally-Block zu tun. Es besteht die Gefahr einer Halbzeitarbeit, die für die meisten Zwecke gefährlich wäre. Ein Rollback wäre eine bessere Option, nachdem der Status der Transaktion als AKTIV geprüft wurde.

HTH.

Danke, Nitin

Verwandte Themen