단일 트랜잭션에서 2 개의 DAO 방법을 관리하는 방법


12

인터뷰에서 누군가가 나에게 물었다 : 단일 거래에서 두 가지 거래 /도 방법을 어떻게 관리합니까? 원하는 기능 :

  1. 둘 중 하나라도 실패하면 두 방법을 모두 롤백해야합니다.
  2. 두 가지 방법 모두 단일 트랜잭션으로 별도로 첨부하여 호출 할 수 있습니다.
  3. 관리는 서비스 계층이 아닌 DAO 계층에 있어야합니다.

생각 : 질문은 봄 거래 관리와 관련이 있습니다.

답변:


12

우선, DAO 계층이 아닌 서비스 계층에서 트랜잭션 관리를 수행해야합니다 (따라서 각 트랜잭션에서 적절한 트랜잭션 격리 수준 및 전파를 처리하기 위해 많은 성능 오버 헤드가 발생 함). 또한 작업 단위의 범위 는 데이터 액세스 계층 대신 서비스 계층에서 비롯됩니다. 2 개 이상의 DAO를 처리해야하는 비즈니스 프로세스를 수행한다고 상상해보십시오.

인터넷에는 여기 , 여기 , 여기 와 같은 방향을 가리키는 많은 토론이 있습니다 .

어쨌든 면접이므로 질문을 그대로 받아 들여 봅시다. 내 관점에서 볼 때, @Transactional두 가지 방법 모두에서 주석 (또는 XML 구성)을 사용하고 REQUIRED가치 가있는 트랜잭션 전파를 사용 합니다. 이렇게하면 해당 메소드가 호출되고 이전 트랜잭션이없는 경우 새 트랜잭션이 작성됩니다.

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}

동일한 트랜잭션을 의미 foo()하고 bar()공유합니까? 1이 실패하면 다른 1도 롤백됩니까? 설명을 해줄 수 있습니까?
Satish Pandey

글쎄, 각 메소드는 자체 작업 단위를 선언합니다 : tx는 각 메소드의 끝에서 커밋되며 예외가 발생하면 롤백됩니다.
Alonso Dominguez

따라서 @Transactional(propagation = REQUIRED)전파 및 @Transactional서비스 계층 에 DAO 계층 방법 을 추가해야 하지만 @TransactionalDAO 계층에 넣는 대신 서비스 계층을 착용하면 차이점은 무엇입니까?
atish shimpi

propagation = REQUIRED트랜잭션 주석 전파의 기본값이므로이를 작성할 필요는 없습니다.
Daniel Higueras

2

내 대답에서 스프링과 프레임 워크를 무시하면 함수 매개 변수를 사용하는 기본 아이디어 만 있습니다. 이 개념이 [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();  }
}

1 질문 : 왜 우리가 Tran t두 가지 방법으로 매개 변수로 전달 하고 있습니까? 몇 가지 설명을 해줄 수 있습니까?
Satish Pandey

@Satish는 질문 (항목 # 1 및 # 2)에서 DAO 메소드가 독립적으로 또는 종속적으로 호출 될 수있는 유연성을 가져야하기 때문입니다. 로컬 범위 트랜잭션으로 method1 내부를 커밋하는 경우 method2가 호출되기 전에 method1을 이미 커밋 했으므로 method2에서 문제가 발생한 경우 롤백 할 수 없습니다.
mike30

0

동일한 트랜잭션에서 실행될 수있는 동시에 두 가지 방법이 독립적으로 작동해야 할 가능성이 있으므로 전파 필요를 사용해야합니다. 트랜잭션이 동일한 트랜잭션에서 실행되어야하는 경우 첫 번째 트랜잭션을 사용합니다. 그렇지 않으면 독립적으로 호출 된 경우 새 트랜잭션이 작성됩니다. 내가 틀렸다면 나를 바로 잡으십시오.


예를 들어 주시겠습니까?
Jay Elston
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.