Connection Pool과 세션 상태

풀은 새 커넥션을 만드는 것이 아니라 같은 물리 세션을 다시 빌려줍니다

그래서 이전 요청이 끝내지 않은 트랜잭션이나 autocommit 설정이 다음 요청의 시작 상태를 바꿀 수 있습니다. 문제의 핵심은 “객체 재사용”이 아니라 세션 상태 재사용입니다.

공유되는 실제 자원
Physical DB Connection / Session

애플리케이션은 매번 새 연결처럼 느끼지만, 풀은 같은 세션을 반납받았다가 다음 요청에 다시 대여할 수 있습니다.

비교 축
애플리케이션이 기대하는 상태
실제로 다시 받은 커넥션 상태
시작점
요청마다 깨끗한 새 연결

이전 작업 흔적 없이 현재 요청만 보면 된다고 생각하기 쉽습니다.

이전 세션 문맥이 남아 있을 수 있음

같은 물리 세션을 재사용하므로, 트랜잭션 경계와 세션 설정도 함께 돌아올 수 있습니다.

트랜잭션
열린 작업 없음

이 요청의 COMMIT / ROLLBACK 만 신경 쓰면 된다고 가정합니다.

미완료 트랜잭션이 이어질 수 있음

이전 요청이 정리 없이 반납했다면 잠금이 남고, 다음 요청은 예상 밖의 상태에서 시작합니다.

세션 설정
autocommit 이 기본값일 것

코드가 보는 트랜잭션 경계가 환경마다 같다고 기대합니다.

이전 요청의 설정이 그대로 남을 수 있음

autocommit = false 같은 값이 유지되면 같은 SQL도 다른 묶음으로 확정될 수 있습니다.

운영 결과
요청 단위로 예측 가능한 처리

잠금과 정합성 문제가 코드 흐름 안에서만 결정될 것처럼 보입니다.

잠금 지속, 예기치 않은 확정, 성능 저하

다음 요청이 이전 요청의 부채를 떠안으면서 데이터 정합성과 동시성이 함께 흔들립니다.

실무 규칙 정리 책임은 풀보다 애플리케이션 트랜잭션 경계에 있습니다.
대여 직후 상태 확인

autocommit, 격리 수준, 읽기 전용 여부를 기대값으로 초기화합니다.

반납 전에 명시 종료

성공이면 COMMIT, 실패면 ROLLBACK 으로 열린 작업을 남기지 않습니다.

풀의 자동 정리는 안전망

자동 ROLLBACK 이 있더라도 예외 흐름과 설정 누수까지 대신 설계해 주지는 않습니다.

한 줄 정리: Connection Pool에서는 “새 커넥션을 받았다”가 아니라 “같은 세션을 다시 받았다”를 기본 가정으로 두고 트랜잭션을 정리해야 합니다.