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
의 결과가 계산되기 전에 커밋되지 않을 것이다.
정확하게 이해했다면 addTrace()를 자체 트랜잭션에서 실행하고 반환하는 즉시 커밋하겠습니다. 이것이 REQUIRES_NEW 트랜잭션 전파의 용도입니다. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-propagation-requires_new. 선언적 트랜잭션 처리와 함께 Spring을 사용하는 것이 좋습니다. –
예. 그것이 내가하고 싶은 일입니다. 그것을 시도하고 결과를 게시 할 것입니다. – TechCrunch
@ JBNizet, 예상대로 작동했습니다. 나는 당신이 그것을 게시하면 답변을 받아 들일 것입니다. – TechCrunch