假设我的项目中有以下结构(我使用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多个交易,因此重写所有商业逻辑并不是一个简单的解决方案。对于像这样的情况有什么标准方法,我应该在哪里看?
答案 0 :(得分:3)
出于这个原因,你不应该在DAO中拥有事务逻辑。
通常有一个拥有数据库连接和工作单元的服务层。它启动事务,调用所有参与的DAO,并在事务完成后进行清理。
Spring框架使用方面来实现事务逻辑。你有所有这些DAO的接口。 Spring会生成一个代理,以声明方式处理事务。也许你可以使用其中一些设计概念,即使你不使用Spring。
或者只是学春天。它很好地支持iBatis。