2010-11-18 2 views
1

의 (나는 DAO로 iBatis를 사용하고) 나는 내 프로젝트에 다음과 같은 구조를 가지고 가정하자 :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 
    } 
} 

그래서, 내 질문은, 어떻게이 문제를 해결할 수있다? 내 프로젝트에는 150 개 이상의 트랜잭션이 있으므로 모든 비즈 로직을 다시 작성하는 것은 쉬운 솔루션이 아닙니다. 이런 상황에 대한 표준 접근 방식이 있습니까? 그리고 어디서 볼 수 있습니까?

답변

3

DAO에는 트랜잭션 논리가 없어야합니다.

일반적으로 데이터베이스 연결과 작업 단위 (UOW)를 소유하는 서비스 계층이 있습니다. 트랜잭션을 시작하고 모든 참여 DAO를 호출하고 트랜잭션이 완료된 후 정리합니다.

스프링 프레임 워크는 aspect를 사용하여 트랜잭션 로직을 구현합니다. 당신은 모든 DAO를위한 인터페이스를 가지고 있습니다. Spring은 트랜잭션을 선언적으로 처리 할 프록시를 생성합니다. Spring을 사용하지 않더라도 이러한 디자인 개념을 사용할 수 있습니다.

아니면 그냥 봄을 배우십시오. 그것은 iBatis를 훌륭하게 지원합니다.

+0

음, 다음으로해야 할 일은 봄을 배우는 것입니다. 그러나 나는 이미 DAO에 트랜잭션을 넣는 데 막대한 설계 문제가 있음을 고려했다. – Michael

+0

어쨌든 답변 해 주셔서 대단히 감사합니다. – Michael

+0

리팩토링 할 가치가 있습니다. 트랜잭션 로직이 150 개의 클래스 대신 한 곳에 있으면 코드가 얼마나 작아 질지 생각해보십시오. 그것이 가로 세로 절단 문제에 대해 aspect 지향 프로그래밍이 할 수있는 것입니다. 트랜잭션은 하나입니다. 로깅은 또 다른 것입니다. 이것을 Spring iBatis에 넣는 것만 큼 힘들지는 않습니다. – duffymo