답변:
우선, DAO 계층이 아닌 서비스 계층에서 트랜잭션 관리를 수행해야합니다 (따라서 각 트랜잭션에서 적절한 트랜잭션 격리 수준 및 전파를 처리하기 위해 많은 성능 오버 헤드가 발생 함). 또한 작업 단위의 범위 는 데이터 액세스 계층 대신 서비스 계층에서 비롯됩니다. 2 개 이상의 DAO를 처리해야하는 비즈니스 프로세스를 수행한다고 상상해보십시오.
인터넷에는 여기 , 여기 , 여기 와 같은 방향을 가리키는 많은 토론이 있습니다 .
어쨌든 면접이므로 질문을 그대로 받아 들여 봅시다. 내 관점에서 볼 때, @Transactional
두 가지 방법 모두에서 주석 (또는 XML 구성)을 사용하고 REQUIRED
가치 가있는 트랜잭션 전파를 사용 합니다. 이렇게하면 해당 메소드가 호출되고 이전 트랜잭션이없는 경우 새 트랜잭션이 작성됩니다.
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
@Transactional(propagation = REQUIRED)
전파 및 @Transactional
서비스 계층 에 DAO 계층 방법 을 추가해야 하지만 @Transactional
DAO 계층에 넣는 대신 서비스 계층을 착용하면 차이점은 무엇입니까?
propagation = REQUIRED
트랜잭션 주석 전파의 기본값이므로이를 작성할 필요는 없습니다.
내 대답에서 스프링과 프레임 워크를 무시하면 함수 매개 변수를 사용하는 기본 아이디어 만 있습니다. 이 개념이 [insert framework here] 내에서 적용될 수 있다고 확신합니다.
2 개의 DAO 메소드 외부에서 커밋 / 롤백을 처리해야합니다. 두 가지 방법은 트랜잭션 / 연결을 입력으로 가져와야합니다.
의사 코드 :
bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }
callingMethod() {
Tran t = null;
try {
t = new Conn().open().startTran();
if(method1(t) && method2(t))
t.commit();
else
t.rollBaack();
}
catch(ex) { t.rollBack(); }
finally { t.closeConn(); }
}
Tran t
두 가지 방법으로 매개 변수로 전달 하고 있습니까? 몇 가지 설명을 해줄 수 있습니까?
동일한 트랜잭션에서 실행될 수있는 동시에 두 가지 방법이 독립적으로 작동해야 할 가능성이 있으므로 전파 필요를 사용해야합니다. 트랜잭션이 동일한 트랜잭션에서 실행되어야하는 경우 첫 번째 트랜잭션을 사용합니다. 그렇지 않으면 독립적으로 호출 된 경우 새 트랜잭션이 작성됩니다. 내가 틀렸다면 나를 바로 잡으십시오.
foo()
하고bar()
공유합니까? 1이 실패하면 다른 1도 롤백됩니까? 설명을 해줄 수 있습니까?