https://techblog.woowahan.com/2663/
HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그
{{item.name}} 1부 HikariCP Dead lock에서 벗어나기 (이론편)은 잘 보셨나요? 2부 HikariCP Dead lock에서 벗어나기 (실전편)에서는 실제 장애 사례를 기반으로 장애 원인을 설명하고 해결 사례를 공유하고자
techblog.woowahan.com
HikariCP Dead Lock 과 관련한 기술 블로그 포스팅을 흥미롭게 읽었다. 하지만 다 읽고 난 뒤 한가지 의문점이 남아서, 이를 제대로 이해하고 넘어가고자 한다.

여기서 Sub Transaction 이란 무엇일까? Spring Framework 기준 @Transactional(propagation = Propagation.REQUIRES_NEW) 를 말하는 것일거다.
이런식으로 중첩된 트랜잭션이 생성되면 새로운 커넥션을 요청한다. 그리고, 저자의 말대로 만약 ID 채굴을 같은 트랜잭션에 포함한다면, 외부 트랜잭션이 종료될 때 까지 lock 이 풀리지 않아 비효율적이다. ID 채굴을 위해 해당 테이블에 접근하고자 하는 다른 여러 트랜잭션이 낭비될 것이다. 그러니, ID 채굴은 빨리 끝내버리고 트랜잭션을 종료시켜야 한다.
여기까진 이해했다.
그런데 왜, 동일한 커넥션을 활용해서 트랜잭션을 여러번 처리하면 되는데, 왜 새로운 커넥션이 필요한 것일까? 이는 트랜잭션과 커넥션에 대한 이해의 부족에서 비롯된 것이었고, 따라서 커넥션과 트랜잭션에 대하여 더 공부하게 되었다.
결론적으로, 새로운 커넥션이 필요한 이유는 한 커넥션에서 BEGIN TRANSACTION 을 중첩해서 호출하는 것이 허용되지 않기 때문이다. 일단 BEGIN TRANSACTION 으로 트랜잭션이 시작되면, 해당 트랜잭션을 완료(COMMIT 또는 ROLLBACK)하기 전까지는 새로운 BEGIN TRANSACTION을 시작할 수 없다.
따라서, 중첩 트랜잭션을 처리하려면 각 트랜잭션에 대해 별도의 데이터베이스 커넥션을 사용해야 한다. 위와 같은 경우 REQUIRES_NEW 같은 트랜잭션 전파 옵션을 사용할 때, 스프링 프레임워크가 내부적으로 새 커넥션을 할당받아 트랜잭션을 시작한다.
=======
추가적으로, 이를 다들 중첩된 트랜잭션이라고 불러서 @Transactional(propagation = Propagation.NESTED) 옵션과 많이 헷갈렸는데, 해당 옵션은 한 트랜잭션을 유지하면서 SAVE POINT 와 같이 DBMS 에서 제공하는 다른 메커니즘을 활용하는 방식이다. 그리고, 이는 한개의 커넥션만 활용한다.
좀 더 깊게 공부해 보아야 하겠지만, 이 옵션을 직접 사용하기란 쉽지 않아 보인다.

https://techblog.woowahan.com/2606/
응? 이게 왜 롤백되는거지? | 우아한형제들 기술블로그
{{item.name}} 이 글은 얼마 전 에러로그 하나에 대한 호기심과 의문으로 시작해서 스프링의 트랜잭션 내에서 예외가 어떻게 처리되는지를 이해하기 위해 삽질을 해본 경험을 토대로 쓰여졌습니다.
techblog.woowahan.com
그리고, 저 상황은 이 포스팅의 상황과는 전혀 다른 경우다. 롤백이 필요한게 아니고, 빠르게 ID 채굴하는 것이 필요한 것이기 때문에 이 옵션이 적절하진 않다.
'Spring' 카테고리의 다른 글
| 동시성 문제로부터 비롯된 트랜잭션 격리 수준과 데이터베이스 락의 이해 과정 (0) | 2024.04.16 |
|---|