[Spring] 하나의 트랜잭션 안에서 delete, insert 같이 실행시 순서

민스킴·2024년 8월 20일
0

Spring

목록 보기
8/12

사건 발생

JPA를 사용해서 기존 엔티티를 삭제한 뒤에 새롭게 엔티티를 생성하려고 했는데 duplicate entry 에러가 발생한다. unique 제약 조건이 있는 필드가 중복되기 때문에 발생한 에러인데, 나는 분명 delete 코드를 먼저 실행하였기 때문에 중복 될 이유가 없었다. 하지만 실제로 중복 에러가 발생하는 이상 틀린 것은 나다.

원인

JPA를 사용하면서 hibernate 구현체를 사용하는 경우 동작하는 SQL 순서가 정해져 있기 때문에 발생하는 오류였다.

하나의 트랜잭션 안에서 여러 SQL이 존재할 때, 실행되는 순서가 존재한다.
1. Inserts, in the order they were performed
2. Updates
3. Deletion of collection elements
4. Insertion of collection elements
5. Deletes, in the order they were performed

해결

delete 실행 후 직접 flush 하고 insert를 실행하면 된다. 그것이 싫다면 트랜잭션을 나눌 수 있으나 원자성을 위반하는 행동이기에 좋지 않다고 생각한다.


참고: https://eocoding.tistory.com/74

profile
Boys, be ambitious!

0개의 댓글