낙관적 락의 경우별도 쿼리에 OptimisticLock 같은 어노테이션이 필요가 없긴하다.@Version 이 적용된 필드가 있으면, 자동으로 낙관적 락 옵션이 적용된다.엔티티 수정시 버전 체크가 수행버전 불일치 시 예외가 발생용도다른 트랜잭션에 의해 수정되지 않은 상태에서 엔티티를 안전하게 수정가능이점????Second Lost Updates Problem 두번의 갱신 내역 분실 문제 예방이점이 아니라 그냥 정책에 따라 달라질 내용같은데..암튼 충돌시 첫번째 커밋만 인정된다. Uploaded by N2T
@Version 어노테이션의 역할버전 관리@Version 은 엔티티 필드에 적용되며 해당 필드를 버전 관리용으로 사용자동 버전 증가엔티티가 수정시마다 필드값이 자동으로 증가한다.데이터 일관성 유지트랜잭션 중 엔티티의 버전이 변경시, 이는 다른 트랜잭션이 해당 엔티티를 수정했음을 의미경우 예외가 발생하며 데이터의 일관성 유지가능낙관적 락 테스트@Entity @Getter @Setter @NoArgsConstructor @ToString public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private float price; private int stockQ..
문제가 되는 상황두 사용자가 동시에 같은 데이터를 수정하는 경우 발생사용자 A와 B가 동시에 같은 데이터를 수정A가 먼저 커밋한 후 B가 커밋시A의 변경 사항은 사라지게 되며B의 변경 사항만 남게됨.해결 방안마지막 커밋만 ㅇㅈ 하기최초 커밋만 ㅇㅈ 하기병합충돌을 갱신하는 내용을 병합..개발자가 직접 구현해야함?그런데 이런 상황이 정상인가..마지만 커밋만 ㅇㅈ은 기본적인 방식이다.하지만 최초 커밋은 JPA 의 @Version 기능을 이용하여 원본 버전의 엔티티만 살릴수있다.그냥 낙관적 락 방식이라고 생각하면 된다.최초에 수정된 내용 반영 → 버전 변경이후의 트랜잭션이 수정 불가능이다 .책에서 너무 어렵게 설명해놓은거 아닌가 싶다 Uploaded by N2T
트랜잭션의 ACID 속성1. 원자성(Atomicity)트랜잭션 내의 모든 작업은 하나로 간주된다.트랜잭션안의 작업은 모두 성공하거나, 모두 실패해야한다..2. 일관성 (Consistency)트랜잭션이 실행되기 전과 후에 DB 의 상태는 일관되어야 함.예시데이터베이스 무결성 제약조건이 항상 충족되어야 함.3. 격리성 (Isolation)동시에 수행되는 여러 트랜잭션이 서로 영향을 주지 않도록 격리다른 트랜잭션이 중간 결과에 영향을 받지 않도록 한다.예시@Transcational isolation 속성 ..4. 지속성 (Durability)트랜잭션이 성공적으로 완료되면, 이후에 발생하는 시스템 장애나 오류에도 영향을 받지 않고 영구적으로 저장된다.ANSI 표준 4 가지 트랜잭션 격리 수준READ UNCOMM..
스칼라 타입으로 조회엔티티로 조회 대신 스칼라 타입 ( 기본 데이터 타입 ) 으로 필드 조회영속성 컨텍스트가 결과 관리 X 메모리 사용을 줄일 수 있다.select o.id, o.name, o.price from Order o읽기 전용 쿼리 힌트org.hibernate.readOnly` 힌트 사용시 엔티티를 읽기 전용으로 조회 가능하다.스냅샷의 저장단계를 생략할 수 있다고 한다.스냅샷?Hibernate 가 엔티티를 로드하는 경우 초기의 엔티티의 상태를 말한다고 한다.해당 스냅샷은 트랜잭션이 종료되는 경우 (자동 혹은 명시적인 플러시 시점) 엔티티가 변경되었는지 체크하는 과정에서 사용된다고 한다.더티체킹 라는 부분을 수행하지 않는다고 생각하면 된다.엔티티의 변경감지하는 로직을 수행하지 않는다.TypedQu..
쓰기 지연과 JDBC 배치JDBC 배치 기능INSERT 시 마다 DB와 통신이 발생함.네트워크 IO 비용이 있기에.. 성능에 부정적인 영향을 미친다.JDBC 배치로 SQL 명령을 한 번에 DB로 보내 성능을 극대화 할 수 있다.JPA 플러시 기능 활용JPA 는 내부적으로 플러시 기능으로 DB와 통신함.JPA 는 JDBC 의 SQL 배치 기능을 보다 효과적으로 사용이 가능하다.하이버네이트의 설정hibernate.jdbc.batch_size 속성을 50 으로 설정하면최대 50건의 데이터를 모아서 SQL 배치를 수행함쓰기 지연의 작동 방식같은 종류의 SQL 명령을 모아서 배치 처리함.em.persist(new Member()); // 1 em.persist(new Member()); // 2 em.persis..