이번엔 여러가지 상황을 살펴볼 건데,
트랜잭션 후, 다시 트랜잭션
@Test
void doubleCommit(){
log.info("트랜잭션1 시작");
TransactionStatus status1 = txManager.getTransaction(new DefaultTransactionAttribute());
log.info("트랜잭션1 커밋 시작");
txManager.commit(status1);
log.info("트랜잭션1 커밋 끝");
log.info("트랜잭션1 끝.");
log.info("트랜잭션2 시작");
TransactionStatus status2 = txManager.getTransaction(new DefaultTransactionAttribute());
log.info("트랜잭션2 커밋 시작");
txManager.commit(status2);
log.info("트랜잭션2 커밋 끝");
log.info("트랜잭션2 끝.");
}
간단하다.
그리고 status는 한 트랜잭션에 대한 설정이라서, 다르게 써야 한다. 뭐랄까 쫌 커넥션에 대한 정보? 그런 게 남아 있는 듯?
2023-10-16T04:04:49.268+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션1 시작
2023-10-16T04:04:49.270+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-10-16T04:04:49.272+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Acquired Connection [HikariProxyConnection@2136187679 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] for JDBC transaction
2023-10-16T04:04:49.274+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Switching JDBC Connection [HikariProxyConnection@2136187679 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] to manual commit
2023-10-16T04:04:49.274+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션1 커밋 시작
2023-10-16T04:04:49.275+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Initiating transaction commit
2023-10-16T04:04:49.275+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Committing JDBC transaction on Connection [HikariProxyConnection@2136187679 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA]
2023-10-16T04:04:49.275+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Releasing JDBC Connection [HikariProxyConnection@2136187679 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] after transaction
2023-10-16T04:04:49.275+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션1 커밋 끝
2023-10-16T04:04:49.275+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션1 끝.
2023-10-16T04:04:49.276+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션2 시작
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Acquired Connection [HikariProxyConnection@1470153313 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] for JDBC transaction
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Switching JDBC Connection [HikariProxyConnection@1470153313 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] to manual commit
2023-10-16T04:04:49.276+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션2 커밋 시작
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Initiating transaction commit
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Committing JDBC transaction on Connection [HikariProxyConnection@1470153313 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA]
2023-10-16T04:04:49.276+09:00 DEBUG 37344 --- [ main] o.s.j.d.DataSourceTransactionManager : Releasing JDBC Connection [HikariProxyConnection@1470153313 wrapping conn0: url=jdbc:h2:mem:e7205348-a7d7-4da8-9cd9-424deb061b9e user=SA] after transaction
2023-10-16T04:04:49.276+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션2 커밋 끝
2023-10-16T04:04:49.276+09:00 INFO 37344 --- [ main] hello.springtx.propagation.BasicTxTest : 트랜잭션2 끝.
뭐 그냥 트랜잭션 순차적으로 2번 하는거다.
보면 좀 신기한 점이, 커넥션을 얻어올 때 프록시로 새 객체로 감싸서 가져온다.
근데 트랜잭션 1, 2의 저 프록시 객체는 다르지만 가져오는 물리적 커넥션?
씁.. 물리적이라기 보다는 DB와 연결된 커넥션이라고 하는 게 맞지 않나? 그게 그거라고 보는 건가?
여튼 그거는 같다.
conn0
아마 풀이니 0~pool.size까지 순차적으로 확인 할 테니.
여튼 프록시로 새로 생성해 한번 감싸서 가져온 다는 거.
이러는 이유가 여기의 이 conn0 이 커넥션은 진짜 쫌 원시적인 커넥션? 이라서
우리가 풀의 요소로써 쓸 때는 아무래도 원시커넥션에는 그냥 닫고 연결하고 뭐 커리 전송하고 그런 거 정도만 있겠지 풀에 반환하는 둥 그런 레벨의 기능은 없을거임. 그래서 프록시로 한번 감싸서 풀에 반환하는 기능을 구현한거임.
여튼 뭐 로깅, 사용자정의기능, 트랜잭션 관리 등 여러 이유를 위해 프록시로 한번 감쌈.
여튼 뭐 트랜잭션 범위는 이런 느낌. 주황색.
뭐 하나 커밋하고 그 다음 롤백해도 마찬가지임.
지금은 트랜잭션의 범위에 대해 배우는 중.
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
51. 트랜잭션 전파 4 (0) | 2023.10.16 |
---|---|
50. 트랜잭션 전파 3 (0) | 2023.10.16 |
48. 스프링 트랜잭션 전파 (0) | 2023.10.16 |
47. 트랜잭션과 예외 -활용 (0) | 2023.10.16 |
46. 트랜잭션과 예외 (0) | 2023.10.16 |