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속성이 롤백 위치를 정한다
'🔥 Vamos > Spring' 카테고리의 다른 글
0219 | 스프링의 정석 :: 4-2 (DTO) (1) | 2023.02.19 |
---|---|
0218 | 스프링의 정석 :: 4-1 (MyBatis) (0) | 2023.02.18 |
0214 | 스프링의 정석 :: 3-20 (0) | 2023.02.15 |
0213 | 스프링의 정석 :: 3-19 (@Transactional) (0) | 2023.02.13 |
0212 | 스프링의 정석 :: 3-18 (AOP) (0) | 2023.02.12 |