복붙노트

[SPRING] 최대 절전 모드에서 동시 업데이트 처리

SPRING

최대 절전 모드에서 동시 업데이트 처리

현재 우리는 데이터 계층에서 JDBC를 사용하고 그것을 최대 절전 모드로 대체 할 계획을 가지고 있습니다. 나는 Hibernate를 처음 사용하고 있으며 hibernate가 동시성을 처리하는 방법을 모르고있다. 우리가 트랜잭션 관리를 위해 Spring을 사용한다면, 동시 업데이트가 어떻게 처리 될지 설명 할 수있다 : hibernate (최대 절전 모드의 메모리 자동 버전 관리) 또는 수동으로 동시 업데이트를 처리하기 위해 데이터베이스에 버전 열을 넣어야한다.

해결법

  1. ==============================

    1.트랜잭션 관리를 위해 Spring을 사용하든 그렇지 않든 상관없이 동시성 관리와 관련해서는 중요하지 않으며 실제로는 Hibernate에 의해 처리됩니다. Hibernate는 optimistic locking과 pessimistic locking 인 동시 업데이트를 처리하기 위해 2 가지 전략을 사용할 수 있습니다.

    트랜잭션 관리를 위해 Spring을 사용하든 그렇지 않든 상관없이 동시성 관리와 관련해서는 중요하지 않으며 실제로는 Hibernate에 의해 처리됩니다. Hibernate는 optimistic locking과 pessimistic locking 인 동시 업데이트를 처리하기 위해 2 가지 전략을 사용할 수 있습니다.

    낙관적 잠금을 사용할 때 특수 속성 (숫자, 타임 스탬프)을 버전으로 매핑합니다 (실제로 열이 있으므로). 이 버전은 당신이 엔티티를 검색하고 업데이트 중에 where 절에 포함되고 Hibernate에 의해 증가 될 때 읽혀진다.

    이것이 어떻게 작동 하는지를 설명하기 위해, id = 1 및 현재 버전 = 1로 Person 엔티티를로드한다고 가정 해 봅시다. 저장 후에, Hibernate는 다음과 같은 것을 수행 할 것이다 :

    update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
    

    이제는 두 개의 동시 트랜잭션이 실행 중이며 각각 동일한 엔티티 (동일한 버전 번호)를로드하고 이름을 변경한다고 가정 해보십시오.

    트랜잭션 # 1이 먼저 커밋되었다고 가정하면 다음 쿼리가 수행됩니다.

    update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;
    

    성공하고 버전이 증가합니다.

    그런 다음 트랜잭션 # 2가 커밋되면 다음 쿼리가 수행됩니다.

    update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;
    

    where 절이 어떤 레코드와도 일치하지 않으므로이 항목은 아무 것도 업데이트하지 않습니다. 여기서 낙관적 인 동시성 예외가 발생합니다.

    이 전략은 연결을 유지하지 않을 때, 동시 액세스가 자주 발생하지 않고 실제로 확장 할 때 적합합니다. 버전 속성을 매핑하는 한 Hibernate는 모든 것을 투명하게 처리한다.

    Pessimistic 잠금을 사용할 때, Hibernate는 (일반적으로 SELECT ... FOR UPDATE를 사용하여) 작업을 마칠 때까지 독점적으로 레코드를 잠급니다. 동일한 레코드에 액세스하려고하는 다른 동시 트랜잭션은 잠금이 제거 될 때까지 일시 중단됩니다. 이 전략은 성능의 가격으로 더 나은 예측 가능성을 제공하며 무기한 확장되지 않습니다.

  2. ==============================

    2.낙관적 잠금이 기본적으로 활성화되고 사용자가 데이터베이스 테이블에 버전 변수를 유지할 필요가없는 objectDB와 같은 JPA 구현이 있으므로 내부적으로 objectDB가주의를 기울입니다. 낙관적 인 잠금은 업데이트가 자주 발생하지 않고 잠금이 전자 상거래처럼 잠정적으로 비용이 발생하는 곳에서는 잠금이 비즈니스 손실을 의미합니다. 비관적 잠금은 동시성이 많이 요구되지 않고 자원을 확보하기 위해 트랜잭션이 빠르게 완료되는 경우 이상적입니다.

    낙관적 잠금이 기본적으로 활성화되고 사용자가 데이터베이스 테이블에 버전 변수를 유지할 필요가없는 objectDB와 같은 JPA 구현이 있으므로 내부적으로 objectDB가주의를 기울입니다. 낙관적 인 잠금은 업데이트가 자주 발생하지 않고 잠금이 전자 상거래처럼 잠정적으로 비용이 발생하는 곳에서는 잠금이 비즈니스 손실을 의미합니다. 비관적 잠금은 동시성이 많이 요구되지 않고 자원을 확보하기 위해 트랜잭션이 빠르게 완료되는 경우 이상적입니다.

  3. ==============================

    3.Hibernate 커뮤니티 위키에서 세션과 트랜잭션에 관한 문서가있다. 궁극적으로 기본 RDBMS 트랜잭션에 의해 처리되지만로드되거나 저장되는 오브젝트의 수명주기에주의를 기울여야합니다.

    Hibernate 커뮤니티 위키에서 세션과 트랜잭션에 관한 문서가있다. 궁극적으로 기본 RDBMS 트랜잭션에 의해 처리되지만로드되거나 저장되는 오브젝트의 수명주기에주의를 기울여야합니다.

  4. ==============================

    4.Hibernate는 버전 관리를 독자적으로 처리한다. 건전한 제안은 버전 번호를 전혀 변경하지 않는 것이다.

    Hibernate는 버전 관리를 독자적으로 처리한다. 건전한 제안은 버전 번호를 전혀 변경하지 않는 것이다.

    Hibernate에서의 버전 관리에 대한 더 많은 정보

    일반적인 그러나 간단한 가이드

  5. from https://stackoverflow.com/questions/3616321/concurrent-updates-handling-in-hibernate by cc-by-sa and MIT license