Java 如何使用iBatis解决嵌套事务问题?

Java 如何使用iBatis解决嵌套事务问题?,java,transactions,ibatis,Java,Transactions,Ibatis,假设我的项目中有以下结构(我使用iBatis作为DAO): 所以,我的问题是,我如何解决这个问题?我的项目中有150多个事务,所以重写所有业务逻辑不是一个容易的解决方案。对于这种情况,有没有标准的方法?我应该在哪里查看?正是因为这个原因,DAO中不应该有事务逻辑 通常有一个服务层负责数据库连接和工作单元。它启动事务,调用所有参与的DAO,并在事务完成后进行清理 Spring框架使用方面来实现事务逻辑。您将拥有所有这些DAO的接口。Spring将生成一个以声明方式处理事务的代理。也许你可以使用这些

假设我的项目中有以下结构(我使用iBatis作为DAO):


所以,我的问题是,我如何解决这个问题?我的项目中有150多个事务,所以重写所有业务逻辑不是一个容易的解决方案。对于这种情况,有没有标准的方法?我应该在哪里查看?

正是因为这个原因,DAO中不应该有事务逻辑

通常有一个服务层负责数据库连接和工作单元。它启动事务,调用所有参与的DAO,并在事务完成后进行清理

Spring框架使用方面来实现事务逻辑。您将拥有所有这些DAO的接口。Spring将生成一个以声明方式处理事务的代理。也许你可以使用这些设计概念,即使你不使用Spring


或者只是学习春天。它很好地支持iBatis。

好吧,接下来我要做的就是学习Spring。然而,我已经考虑到,将事务放入DAO中存在巨大的设计问题。这可能值得重构。考虑一下,如果事务逻辑位于一个位置而不是150个类中,那么代码会小多少。这就是面向方面编程可以为横切关注点做的事情。交易是其中之一;日志记录是另一个问题。你可能会发现,在春季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
    }
}