최대 절전 모드에서 동시 업데이트 처리
현재 우리는 데이터 계층에서 JDBC를 사용하고 있으며 최대 절전 모드로 교체할 계획입니다.나는 휴면 상태가 처음이라 휴면 상태가 동시성을 어떻게 처리하는지 잘 모르겠습니다.트랜잭션 관리에 스프링을 사용하면 동시 업데이트가 처리되는 방법, 즉 최대 절전 모드(최대 절전 모드의 메모리 자동 버전 관리) 또는 데이터베이스에 버전 열을 넣어 수동으로 동시 업데이트를 처리해야 하는지 누가 설명해 주시겠습니까?
트랜잭션 관리에 스프링을 사용하는 경우, 최대 절전 모드(최대 절전 모드의 메모리 자동 버전 관리)에서 동시 업데이트를 처리하는 방법 또는 수동으로 동시 업데이트를 처리하기 위해 데이터베이스에 버전 열을 넣어야 하는 경우, 누가 설명해 주시겠습니까?
트랜잭션 관리에 Spring을 사용하든 사용하지 않든 동시성 관리와 관련하여 중요하지 않으며 실제로 Hibernate에서 처리합니다.최대 절전 모드에서는 낙관적 잠금과 비관적 잠금의 두 가지 전략을 사용하여 동시 업데이트를 처리할 수 있습니다.
낙천적인.
낙관적 잠금을 사용할 때는 특수 속성(숫자, 타임스탬프)을 버전으로 매핑합니다. 따라서 실제로 해당 속성에 대한 열이 있습니다.이 버전은 엔티티를 검색할 때 읽으며 업데이트 중에 where 절에 포함되어 최대 절전 모드로 증가합니다.
이 방법을 설명하기 위해 ID=1 및 현재 버전=1로 사용자 엔터티를 로드한다고 가정해 보겠습니다.저장 후 최대 절전 모드는 다음과 같은 작업을 수행합니다.
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에 의해 투명하게 처리됩니다.
비관적인
잠금을 할 때 할 때까지 를 잠급니다(으로 Hibernate는 잠급니다.SELECT ... FOR UPDATE한 레코드에 동일한 레코드에 액세스하려는 다른 동시 트랜잭션은 잠금이 제거될 때까지 일시 중단됩니다.이 전략은 성능의 대가로 더 나은 예측 가능성을 제공하며 무한 확장되지 않습니다.
레퍼런스
- 최대 절전 모드 코어 참조 가이드
객체와 같은 JPA 구현이 있습니다.낙관적 잠금이 기본적으로 활성화되고 사용자가 데이터베이스 테이블에서 버전 변수를 유지할 필요가 없는 DB는 객체 DB에 의해 내부적으로 관리됩니다.낙관적인 잠금은 업데이트가 빈번하지 않고 전자 상거래처럼 잠금에 암묵적인 비용이 드는 경우에 좋습니다. 잠금은 비즈니스 손실을 의미합니다.비관적인 잠금은 동시성이 크게 요구되지 않고 리소스를 확보하기 위해 트랜잭션이 신속하게 완료되는 경우 이상적입니다.
최대 절전 모드 커뮤니티 위키에는 세션 및 트랜잭션에 대한 몇 가지 문서가 있습니다.이 작업은 기본 RDBMS 트랜잭션에서 처리되지만 로드되거나 저장된 개체의 수명 주기에 주의해야 합니다.
최대 절전 모드는 버전을 자체적으로 처리하므로 버전 번호를 전혀 변경하지 않는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/3616321/concurrent-updates-handling-in-hibernate
'programing' 카테고리의 다른 글
| UI 스택 뷰의 다중 선 레이블 (0) | 2023.06.08 |
|---|---|
| 중첩된 개체 돌연변이의 Vuex 중복 값 (0) | 2023.06.08 |
| parallel_enabled가 없는 ODCIAgregateMerge (0) | 2023.06.08 |
| Vuejs, 왜 이런 거지?스토어 모듈에서 액세스할 때 $store.state.route.params.activityId가 정의되지 않았습니다. (0) | 2023.06.08 |
| ggplot2에서 회전 및 간격 축 레이블 (0) | 2023.06.08 |