beadss / jpa-study

jpa슽터디입니다
1 stars 2 forks source link

JPA 3장에서의 의문 #4

Open beadss opened 5 years ago

beadss commented 5 years ago

자동생성 PK에 대한 의문

자동생성 PK를 지니는 엔티티의 경우, 아래 세가지 내용이 서로 충돌합니다.

토막 상식(인데 정확히 답하라고하면 어버버 하게 되는)

자동 증가되는 식별자는 일반적으로 트랜잭션 외부에 존재하는 전용 lock을 지니고 있습니다.
예를들어 트랜잭션 1에서 증가시킨 식별자 값을 얻어가는 즉시 트랜잭션 종료와는 별개로 식별자 lock을 해제합니다.
insert 구문이 수행된 후에 트랜잭션이 실패하면 동일 테이블에 다음 insert 시, 식별자 값이 연속적이지 않습니다.(1개 증가가 아닌 2개 이상 증가)

하이버네이트는 이걸 어떻게 해결했는가

하이버네이트는 IDENTITY ID 전략을 지닌 객체를 persist할 때, 해당 구문을 즉시 DB로 전달합니다.

1차 캐시가 대체 어떤 이득을 주는가?

1차 캐시는 변경 감지를 위해 필수적인 요소이긴 합니다만, 굳이 캐시라는 이름을 붙일 필요가 있었나 싶을 정도로 성능과는 연관이 없어보입니다.(캐시가 주는 이득은 성능 뿐이므로..)

아래는 전제 조건입니다,

MySQL, SQL Server, Oracle에서 1차 캐시의 공통적인 무쓸모

굳이 찾아본 이득

1차 캐시는 마치 MySQL의 REPEATABLE READ처럼 동작합니다.(다른 트랜잭션에서 데이터를 업데이트 하든 말든 계속 같은 데이터를 돌려줌) 그런고로 MySQL에서는 불필요한 질의를 줄인다는 것을 제외하면 별다른 이득이 없습니다. 근데 위의 무쓸모를 생각하면, 현실적으로 아무런 이득이 없어보입니다.

SQL Server의 경우에는 REPEATABLE READ가 트랜잭션이 종료될 때 까지 SHARED LOCK을 잡아버리므로, 굳이 LOCK이 필요하지 않은 경우에는 성능적인 이득이 있습니다.

Oracle의 경우에는 REPEATABLE READ 자체를 지원하지 않아서, 기능상의 이득이 있겠습니다만.. 위의 공통적인 무쓸모를 생각해보면...

2xel commented 5 years ago

IDENTITY ID 전략을 지닌 객체를 persist할 때, 해당 구문을 즉시 DB로 전달합니다.

너무 당연한 얘긴데 이런 의문을 가지질 못했었네요.