0214 | 스프링의 정석 :: 3-20

서비스 계층의 분리와 Transactional(2) 테스트에서 만들어 썼던 트랜잭션 매니저를 직접 주입해서 사용하기 : 트랜잭션 매니저를 root-context에 빈으로 등록하고, 을 끌어오려고 했는데 강의화면이랑

ala-nueva.tistory.com

 

 

 

3. Required와 Requires_new - REQUIRED
: 트랜잭션의 경계가 어디냐에 따라서 롤백할때 위치가 달라진다

: REQUIRED가 있으면 새로운 트랜잭션을 만들지 않고 기존 트랜잭션을 기준으로 하나의 그룹으로 인식한다.

 

 

* REQUIRED - REQUIRED

@Transactional (propagation = Propagation.REQUIRED)
public void insertA1withTx() throws Exception{
	ADao.insert(1,100); // A1
    insertBWithTx(); // 여기서 insertBWithTx()로 넘어감
    ADao.insert(1,200); // A2
}

@Transactional (propagation = Propagation.REQUIRED) // required는 기존에 Tx가 있으면 새로 Tx를 만들지 않는다.
public void insertBWIthTx() throws Exception{
	BDao.insert(1,100);	// B1
    BDao.insert(1,200); // B2
}    
---------------------------------------------------
// Tx시작 - A1 - B1 - B2 - A2 - Tx끝 으로 중간에 트랜잭션이 생성되지않는다.
// 두개의 트랜잭션이 하나의 트랜잭션인것처럼 하나로 돌아간다.
// 중간에 오류가 생기면 롤백은 가장 최초로 돌아간다. 트랜잭션 시작점이 앞에있기때문.

 

 

*REQUIRED - REQUIRES_NEW

@Transactional (propagation = Propagation.REQUIRED)
public void insertA1withTx() throws Exception{
	ADao.insert(1,100); // A1
    insertBWithTx(); // 여기서 insertBWithTx()로 넘어감
    ADao.insert(1,200); // A2
}

@Transactional (propagation = Propagation.REQUIRES_NEW) // 새로운 트랜잭션이 필요하다는 뜻
public void insertBWIthTx() throws Exception{
	BDao.insert(1,100);	// B1
    BDao.insert(1,200); // B2
}    
---------------------------------------------------
// Tx1시작 - A1 - (Tx2시작- B1 - B2 - Tx2끝) - A2 - Tx1끝 으로 중간에 트랜잭션이 생성되지않는다.
// A2에서 에러가 났을 시 Tx1로 돌아가면서 A1은 성공이 취소되지만, Tx2는 별개의 트랜잭션이므로 커밋된 상태로 남는다.(성공상태)
// propagation속성이 롤백 위치를 정한다

 

+ Recent posts