Как решить проблему вложенных транзакций с iBatis? - PullRequest
1 голос
/ 18 ноября 2010

Предположим, у меня есть следующая структура в моем проекте (я использую iBatis в качестве DAO):

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
    }
}

Итак, мой вопрос, как я могу решить эту проблему?В моем проекте более 150 транзакций, поэтому переписать всю логику бизнеса нелегко.Есть ли стандартный подход для подобных ситуаций и где я должен смотреть?

1 Ответ

3 голосов
/ 18 ноября 2010

У вас не должно быть логики транзакций внутри DAO именно по этой причине.

Обычно существует сервисный уровень, который владеет подключением к базе данных и единицей работы. Он запускает транзакцию, вызывает все участвующие DAO и очищает ее после завершения транзакции.

Среда Spring использует аспекты для реализации транзакционной логики. У вас будут интерфейсы для всех этих DAO. Spring сгенерирует прокси, который будет обрабатывать транзакцию декларативно. Возможно, вы могли бы использовать некоторые из этих концепций дизайна, даже если вы не используете Spring.

Или просто учить весну. Он прекрасно поддерживает iBatis.

...