✏️ 2023-01-27 Today I Learn

@mitoconcrete · January 27, 2023 · 4 min read

220127 : AUTOINCREMENT가 ROLLBACK이 되지 않는이유

오늘 같이 공부하시는 분과 이야기를 하다가, 만약, IDENTITY전략을 사용하는 repository가 save 이후 롤백이 되었을 경우, PK가 증가할것인가? 증가하지 않을 것인가에 대한 토론을 했다. 동료는 증가할것이라고 생각하셨고, 나는 증가하지 않을거라고 추측했다. 나의 주장에 대한 근거는 다음과 같았다.

  1. 트랜잭션을 롤백하는 주체가 영속성 컨택스트이다.
  2. AUTOINCREMENT가 증가하는 시점은 트랜젝션이 DB에 도달하는 시점이다.
  3. 영속성 컨택스트 단에서 롤백을 하면, 트랜젝션은 아예 flush를 하지않기 때문에 PK는 증가하지 않을 것이다.
  4. 또한, 롤백이기 때문에 증가해도 AUTOINCREMENT값이 되돌아 올 것이다.

의도적으로 회원가입하는 로직에서 롤백을 하도록 설정해놓았고, 결과를 살펴보았다. 결과는 의도와 다르게 동작했다. 롤백된 트랜젝션이 DB에 영향을 주어, AUTOINCREMENT가 증가하고 있었기 때문이다. 해당 이슈의 원인을 살펴보기 위해 리서치를 해보았다. 위처럼 동작하는 이유는 아래와 같았다.

  1. 영속성 컨택스트에서 엔티티가 관리되기 위해서는 고유의 PK가 필요하다.
  2. 내가 사용하는 ID생성전략은 DB에 ID생성권한을 위임하는 IDENTITY전략이다. 따라서, save이후 플러시 전까지 해당 엔티티가 영속성 컨택스트에서 관리되어야하는데 그러기 위해서는 PK를 받아와야한다.
  3. 따라서, DB에 INSERT쿼리문을 날려서 PK를 받아와 할당해준다. 이후, 롤백 시 아직 transaction을 커밋하지 않아 db에 해당 entity는 flush되지 않지만, 이미 AUTOINCREMENT는 증가한 상태라 다시 되돌아오지 않는다.

만일 ID를 직접할당해주는 전략을 사용하게되면, INSERT문을 날리는 타이밍이 트랜젝션 커밋이후가 되기 때문에, AUTOINCREMENT가 증가하지 않는 결과를 볼 수 있다.

몰랐던 상황을 스터디하면서, 깨달을 수 있어서 좋았다. 또한, 오늘 테스트코드 작성 및 프론트엔드 셋팅등을 동료들과 하면서, 처음알게 된 사실이 생겼다. 이에 따라, 교류를 통해 성장하는게 이런것이구나 하는 유의미한 교훈을 얻을 수 있었다.

사람들이 잘한다 잘한다 해주시니, 정말 내가 뭔가를 잘하고 있구나 생각하고 있었는데, 다른 분들과 교류하면서 굉장히 우물 안 개구리였음을 요새들어 더 많이 느끼는 중이다. 초반에도 되새겼지만, 항상 겸손한 자세로 상대에 대한 리스펙을 유지하며 대화하는 예의를 갖춰야겠다고 다시금 다짐하게 되었다.

@mitoconcrete
어제보다 조금 더 성장하기 위해 기록합니다.