2016-06-10 4 views
1

내 응용 프로그램에서는 서비스 클래스 함수가 ​​호출 될 때마다 데이터베이스에 추적 레코드를 작성합니다. 다음은 의사 코드입니다. Java, Spring JDBC 및 MySQL에서 중첩 트랜잭션을 구현하는 방법

public Class A { 
    Tracer tracer; 
    B b; 
    void functionA() { 
     tracer.addTrace(input); 
     TransactionManger.getTransaction(); // Transaction starts. 
     result = b.functionB(); 
     if(result == 0) { 
      // rollback 
     } else { 
      // commit 
     } 
    } 
} 

public Class B { 
    Tracer tracer; 
    int functionB() { 
     tracer.addTrace(input); 
     TransactionManger.getTransaction(); // Transaction starts. 
     // Do whatever. Return. 
    } 
} 

functionB 0을 반환, 추적이 데이터베이스로 롤백지고 추가 한 경우 addTrace 기능은 위의 상황에서, 데이터베이스에 레코드를 기록한다고 가정? 이 상황을 피하는 방법? MySQL은 중첩 된 트랜잭션을 지원하지 않는다. 그래서 나는 addTrace 안에 새로운 거래를 할 수없고 닫는다. functionA의 변화는 functionB의 결과가 계산되기 전에 커밋되지 않을 것이다.

+1

정확하게 이해했다면 addTrace()를 자체 트랜잭션에서 실행하고 반환하는 즉시 커밋하겠습니다. 이것이 REQUIRES_NEW 트랜잭션 전파의 용도입니다. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-propagation-requires_new. 선언적 트랜잭션 처리와 함께 Spring을 사용하는 것이 좋습니다. –

+0

예. 그것이 내가하고 싶은 일입니다. 그것을 시도하고 결과를 게시 할 것입니다. – TechCrunch

+0

@ JBNizet, 예상대로 작동했습니다. 나는 당신이 그것을 게시하면 답변을 받아 들일 것입니다. – TechCrunch

답변

-1

일반적인 질문에 대비하십시오. 정확히 달성하려는 것은 무엇입니까? 또한 문제를 다시 말해 주시겠습니까?

먼저 복합 문을 String으로 준비하고 모든 검사가 끝날 때 한 번 커밋 할 수있는 것 같습니다.

+1

추적은 실제 트랜잭션과 다르며 서로 다른 서비스 클래스입니다. 그래서 나는 그것들에서 합성 문장을 만들 수 없다. – TechCrunch

관련 문제