1

Below Aktualisierung ist ein Ausschnitt aus unserem Quellcode ...Hibernate JPA mehrere Web-Dienste dieselbe Tabelle

@transactional 
public void doSomething(){ 
    User user = (set up user fields) 
    userDao.merge(user); //update USER table 
    //call another web service which also updates USER table 
    //do other processes 
} 

Problem ist, das Update von dem anderen Web-Service durch das Update von userDao.merge, da sie außer Kraft gesetzt wird verpflichtet die Zusammenführungstransaktion erst, wenn die transaktionale Methode abgeschlossen ist.

Wie gehen Sie mit dieser Situation um? Ich möchte sowohl update von userdao.merge und das Update durch den anderen Web-Service auf dem Datensatz getan werden.

+0

Ich nehme an, Sie verwenden JTA nicht über die Anwendungen hinweg, um die Transaktion zu synchronisieren? Mit anderen Worten, sie sind zwei getrennte Anwendungen, die zufällig dieselbe Datenbankzeile gleichzeitig mit ihren eigenen Transaktionen manipulieren. – Naros

+0

Ich denke, eine bessere Frage wäre, interessiert es dich, ob der andere Web-Service fehlschlägt, obwohl der ursprüngliche Web-Service erfolgreich ist? – Naros

+0

Ich benutze es nicht. Muss ich das tun? Wie implementiere ich es? –

Antwort

0

Legen Sie das erste Update des Benutzers in einem neuen Verfahren Transaktions mit REQUIRES_NEW Ausbreitung markiert:

@Transactional 
public void doSomething(){ 

    updateUser(); 

    //call another web service which also updates USER table 
    //do other processes 
} 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void udateUser(){ 

User user = (set up user fields) 
    userDao.merge(user); //update USER table 

} 

Vor dem Aufruf wird die innere Transaktion WebService verpflichtet wird und führt zu dem Webservice sichtbar. Denken Sie daran, wenn der Webservice fehlschlägt. Das erste Update des Benutzers wird nicht zurückgesetzt.

+0

Sie sagen also, Rollback kann in dieser Situation nur manuell durchgeführt werden? @Transactional kann nicht automatisch damit umgehen? –

+0

Diese Lösung funktioniert auch nicht. Das Problem des Benutzers besteht darin, dass der Aufruf an den anderen Webdienst erfolgen muss, nachdem * die ursprüngliche Methode 'doSomething()' die Zusammenführung an die Datenbank gesendet hat. – Naros

+0

@Naros: Gibt es wirklich eine Lösung? Oder diese Logik, die wir haben, wenn zwei Webdienste die gleiche Tabelle aktualisieren, ist keine gute Übung? –

0

Die größte Frage hier ist, ob Sie beide Updates atomar auftreten müssen. In vielen Anwendungen ist das eine Notwendigkeit. In anderen Fällen ist es akzeptabel, eventuelle Konsistenz zu verwenden, und das hängt von Ihren Anforderungen ab.

Wenn Sie atomare Transaktionen benötigen, was bedeutet, dass beide Aktualisierungen durchgeführt werden oder beide nicht, müssen Sie JTA-basierte verteilte Transaktionen in Ihren beiden Anwendungen nutzen. Anwendungsserver stellen diese sofort bereit, Sie müssen lediglich Ihre Anwendungen für die Verwendung konfigurieren.

würde eine nicht-atomare Lösung TransactionSynchronization Schnittstelle bieten #afterCommit() Rückruf mit Frühlings aufrufen:

@Transactional 
public void doSomething() { 
    // do stuff 
    userDao.merge(user); 

    TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronization() { 
     void afterCommit() { 
     // call to second service somehow 
     } 
    } 
); 
} 

Wie Sie nennen das zweite Service ist ganz Ihnen überlassen. Sie könnten eine JMS-Nachricht mit dem Auslöser an eine Warteschlange senden, die der zweite Webdienst überwacht, oder Sie können diesen zweiten Webdienst direkt aufrufen.

Der kritische Teil hier ist, dass der Anruf entweder zum Vermittler oder zum zweiten Netzdienst fehlertolerant sein muss, also versichern Sie sich, dass schließlich Konsistenzvertrag.

+0

Wenn eine Ausnahme beim Aufruf des zweiten Webdiensts auftritt, wie wird der Rollback ausgeführt? –

+0

Sie müssten JTA einrichten und beide Anwendungen für dieselbe verteilte Transaktion abonnieren. Die Spring-Dokumentation behandelt, wie JTA verteilte Transaktionen eingerichtet werden. – Naros