如何解决iBatis的嵌套事务问题?

时间:2010-11-18 12:47:37

标签: java transactions ibatis

假设我的项目中有以下结构(我使用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 个答案:

答案 0 :(得分:3)

出于这个原因,你不应该在DAO中拥有事务逻辑。

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

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

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