2010-11-18 8 views
1

Nehmen wir an, ich die folgende Struktur in meinem Projekt (ich iBatis als DAO bin mit):Wie löst man verschachtelte Transaktionen Problem mit iBatis?

public class UsersManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class StatsManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class App { 
    public void do { 
     myUsersManager.do(); 
     myStatsManager.do(); // here I get an exception, because the transaction is already started 
    } 
} 

Also, meine Frage ist, wie kann ich dieses Problem lösen? Ich habe mehr als 150 Transaktionen in meinem Projekt, daher ist es keine einfache Lösung, alle Geschäftslogik umzuschreiben. Gibt es einen Standardansatz für Situationen wie diesen und wo sollte ich hinschauen?

Antwort

3

Aus genau diesem Grund sollten Sie keine Transaktionslogik in DAOs haben.

Normalerweise gibt es eine Service-Schicht, die die Datenbankverbindung und die Arbeitseinheit besitzt. Es startet die Transaktion, ruft alle beteiligten DAOs auf und bereinigt die Transaktion nach Abschluss der Transaktion.

Das Spring-Framework verwendet Aspekte zur Implementierung der Transaktionslogik. Sie würden Schnittstellen für alle diese DAOs haben. Spring würde einen Proxy generieren, der die Transaktion deklarativ behandelt. Vielleicht könnten Sie einige dieser Designkonzepte verwenden, auch wenn Sie Spring nicht verwenden.

Oder einfach nur Frühling lernen. Es unterstützt iBatis schön.

+0

Nun, das nächste, was ich tun werde, ist Frühling zu lernen. Ich habe jedoch bereits berücksichtigt, dass ich ein großes Designproblem habe, indem ich meine Transaktionen in DAOs umwandele. – Michael

+0

Wie auch immer, vielen Dank für Ihre Antwort. – Michael

+0

Könnte das Refactoring wert sein. Denken Sie darüber nach, wie viel kleiner Ihr Code sein wird, wenn sich die Transaktionslogik an einer Stelle statt an 150 Klassen befindet. Das kann die aspektorientierte Programmierung für Querschnittsaufgaben leisten. Transaktionen sind eins; Logging ist ein anderes. Sie werden feststellen, dass es nicht so schwierig ist, dies in Spring iBatis zu tun, wie Sie es sich vorstellen. – duffymo