2012-04-05 9 views
0

Im Codeausschnitt unten versuche ich, zwei Entitäten zu erhalten - Account und AccountDetails. Ich möchte, dass dies atomar ist. Das bedeutet, dass sowohl die Account- als auch die AccountDetails-Berechtigungen in einer einzigen Transaktion beibehalten werden sollten. Ich kann das nicht erreichen.Persistente Daten in mehreren Tabellen in einer einzigen Transaktion

Bitte beachten Sie, dass die Tabelle AccountDetails die Account-Tabelle mit einem Fremdschlüssel (account.id) referenziert.

Wenn ich versuche, sie in der gleichen Transaktion zu halten, laufe ich in einen Deadlock. Ansonsten brauche ich zwei verschiedene Transaktionen mit verschiedenen Sitzungen.

 Account instance = (Account) transientInstance; 
     Set<AccountDetails> accountDetailses = instance.getAccountDetailses(); 
     AccountsHomeFactory factory = AccountsHomeFactory.getInstance(); 
     AccountDetailsHome accountDetailsDAO = (AccountDetailsHome) factory.getDAO("AccountDetails"); 

     transaction.begin(); 
     sessionFactory.getCurrentSession().persist(instance); 

     transaction.commit(); 
        // get new session ands start the transaction. 
     transaction.begin(); 

     for (AccountDetails accountDetails : accountDetailses) { 
      accountDetailsDAO.persist(accountDetails); 
      log.debug("persist successful"); 
     } 

     log.debug("transaction commit"); 
     transaction.commit(); 

Fragen:

  1. Wie kann ich den Stillstand vermeiden? Warum passiert hier ein Deadlock? Schließlich, logisch, AccountDetails benötigt keine Sperre auf Konto, um beibehalten werden.
+0

Obwohl ich eine Arbeit habe, wo die Sitzungen und Transaktionen von den einzelnen Datenzugriffsobjekten betreut werden, kann ich die Atomizität nicht erreichen, die ich suche. –

+0

Tatsächlich können Sie eine Sitzung nicht für mehr als einen Prozess verwenden. Die Strategie ist eine Sitzung für einen Prozess. Sie können JPA-Implementierung verwenden, ich meine entitymanagerfactory und entitymanager. Sie können den Entity Manager für viele Prozesse verwenden. Aber ich denke mit Sitzung ist es nicht möglich. – mbaydar

+0

Es ist nicht sinnvoll, eine Transaktion für eine Funktionstabelle und ihre Detailtabelle anzulegen. Ich würde niemals die beiden Operationen trennen wollen. Was, wenn ich Änderungen in mehreren Tabellen in einer einzelnen Transaktion vornehmen möchte. Irgendeine Möglichkeit, das zu tun? –

Antwort

0

Ich denke, was Sie tun möchten, ist etwas möglich. Die Lösung besteht aus mehreren Transaktionen für eine Sitzung. Sie können lesen this Ich hoffe, es wird Ihnen helfen.

+0

Nun, Sie haben Recht. Die Sitzung kann sich über mehrere Transaktionen erstrecken. Die Transaktionen und Sitzungen müssen zentral behandelt werden, anstatt sie den Datenobjekten oder Datenebenentitäten zu überlassen. Danke für Ihre Hilfe. –

Verwandte Themen