속성 | 설명 |
---|---|
propagation | Tx의 경계를 설정하는 방법을 지정 |
isolation | Tx의 isolation level을 지정. |
readOnly | Tx가 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상 |
rollbackFor | 지정된 예외가 발생하면, Tx을 rollback한다. RuntimeExceoption과 Error는 자동 rollback한다. |
noRollbackFor | 지정된 예외가 발생해도, Tx을 rollback하지 않음 |
timeout | 지정된 시가(초) 내에 Tx가 종료되지 않으면, Tx를 강제 종료 |
값 | 설명 |
---|---|
REQUIRED | Tx가 진행중이면 참여하고, 없으면 새로운 Tx 시작(디폴트) |
REQUIRES_NEW | Tx이 진행중이건 아니건, 새로 Tx 시작 |
NESTED | Tx가 진행 중이면, Tx의 내부 Tx로 실행 |
MANADATORY | 반드시 진행중인 Tx내에서만 실행가능. 아니면 예외발생 |
SUPPORTS | Tx가 진행중기너 아니건 상관없이 실행 |
NOT_SUSPEND | Tx없이 처리. Tx가 진행중이면 잠시 중단(suspend) |
NEVER | Tx없이 처리. Tx가 진행중이면 예외 발생 |
REQUIRED, REQUIRES_NEW가 중요함
REQUIRES_NEW는 Tx안에 다른 Tx 즉 서로 다른것
NESTED는 Tx안에 subTx가 있다. -> 같은 Tx
A1 - B1 - B2 - A2 순서이다.
만약 REQUIRED가 있고 Tx가 기존에 있으면 새로 Tx 안만듬
만약 Tx1 시작했을때 B1,B2에 대한 트렌젝션이 만들어지지 않고 바로 하나인 것처럼 간다는 뜻이다. 만약 B2에서 에러가 발생하면 A1까지 Rollback이 된다.
둘다 REQUIRED마치 하나인 것처럼 돌아간다.
2번째가 REQUIRED인지 무엇인지가 중요하다.
기존 것이 있으면 굳이 만들지 않는 것이다.
위의 사진과 비교하면 차이를 알 수 있다. 새로운 Tx가 필요하다는 뜻이다. 여기서 만약 B2에서 에러가 발생해서 Rollback하면 B1으로 돌아가는 것이다.
ex)
A1 - 성공
B1 - 성공
B2 - 성공
A2 - 에러
이 경우에는 A1으로 rollback이 된다. 그러면 B1,B2는 commit이 된다. 왜냐하면 다른 트렌젝션이기 때문이다.
위하고 다른 것을 알아두자.