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

标签 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 多笔交易,因此重写所有业务逻辑并非易事。是否有针对此类情况的标准方法?我应该关注哪里?

最佳答案

正是出于这个原因,您不应该在 DAO 中使用事务逻辑。

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

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

或者只学习Spring。它很好地支持 iBatis。

关于java - 如何使用 iBatis 解决嵌套事务问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4214888/

相关文章:

java - 我可以使用某些 python(或 Java)API 将文件夹复制到 dmg 文件中吗?

oracle - 在 Oracle 中查看未结事务

java - MyBatis 不区分大小写的反序列化

java - 以 "type safe"方式做某事是什么意思?

java - 在 HSQL 中使用 DATE 函数时出错

java jlabel setText(str) 当str有韩文字符时错误

java - Kubernetes Ingress 应该与 Spring Cloud Gateway 共存吗?

Java - List<Integer> 排序、比较器和溢出

java - JNDI 查找失败(Spring、JBoss)

mysql - 如何禁止 2 位用户使用 MySQL 在 Web 应用程序中编辑相同的数据(如果可能,使用 CodeIgniter)