반응형
LockModeType Jpa 간의 차이
JPA에서 LockModeTypes가 작동하는지 헷갈립니다.
LockModeType.Optimistic
- 커밋하는 동안 버전이 증가합니다.
- 여기서 질문은: 엔티티에 버전 열이 있고 이 잠금 모드를 지정하지 않은 경우에도 유사하게 작동한다면 무엇을 사용할 수 있습니까?
LockModeType.OPTIMISTIC_FORCE_INCREMENT
- 여기서 엔티티가 업데이트되지 않더라도 버전 열이 증가합니다.
- 그러나 이 트랜잭션이 커밋되기 전에 동일한 행을 업데이트한 다른 프로세스가 있다면 이 프로세스가 무슨 소용이 있습니까?어쨌든 이 거래는 실패할 것입니다.그래서 이것이 무슨 소용이 있습니까?
LockModeType
.
LockModeType.PESSIMISTIC_READ
- 이 잠금 모드는 다음을 실행합니다.
select for update nowait
(힌트 시간 초과가 지정되지 않은 경우).. - 으로 이 까지 다른 이할 수 입니다. 왜 이 이 "a"로 지정되었는지를 합니다.
Read
자물쇠?
- 이 잠금 모드는 다음을 실행합니다.
LockModeType.PESSIMISTIC_WRITE
- 이 잠금 모드는 또한 다음을 발생시킵니다.
select for update nowait
(힌트 시간 초과가 지정되지 않은 경우). - 은 이 와 여서질이잠모금의 이 무엇인지에 것입니다.
LockModeType.PESSIMISTIC_READ
내가 보기엔 둘 다 같은 질문을 하는 것 같은데요?
- 이 잠금 모드는 또한 다음을 발생시킵니다.
LockModeType.PESSIMISTIC_FORCE_INCREMENT
- 은 는이 합니다.
select for update nowait
(힌트 시간 초과가 지정되지 않은 경우) 및 버전 번호도 증가합니다. - 저는 그것을 전혀 사용하지 못했습니다.
- 과 같은 경우 :
for update no wait
있어?
- 은 는이 합니다.
먼저 낙관적 잠금과 비관적 잠금을 구별하겠습니다. 왜냐하면 기본 메커니즘이 다르기 때문입니다.
낙관적 잠금은 JPA에 의해 완전히 제어되며 DB 테이블의 추가 버전 열만 필요합니다.관계형 데이터를 저장하는 데 사용되는 기본 DB 엔진과는 완전히 독립적입니다.
반면에 비관적 잠금은 테이블의 기존 레코드를 잠그기 위해 기본 데이터베이스에서 제공하는 잠금 메커니즘을 사용합니다. JPA는 이러한 잠금을 트리거하는 방법을 알아야 하며 일부 데이터베이스는 잠금을 부분적으로만 지원하지 않습니다.
이제 잠금 유형 목록으로 이동합니다.
LockModeType.Optimistic
- 엔티티가 버전 필드를 지정하는 경우 이 필드가 기본값입니다.버전 열이 없는 엔티티의 경우 이러한 유형의 잠금을 사용하면 JPA 구현에서 작동하지 않습니다.이 모드는 일반적으로 ObjectDB에서 지정한 대로 무시됩니다.제 생각에는 잠금 모드를 동적으로 계산하고 잠금이 최종적으로 낙관적이더라도 추가로 전달할 수 있도록 존재합니다.가능성이 높지는 않지만 기본값을 참조할 수 있는 옵션을 제공하는 것은 항상 좋은 API 설계입니다.
예:
`LockModeType lockMode = resolveLockMode(); A a = em.find(A.class, 1, lockMode);`
LockModeType.OPTIMISTIC_FORCE_INCREMENT
- 거의 사용되지 않는 옵션입니다.그러나 다른 엔터티에서 이 엔터티를 참조하여 잠그려면 합리적일 수 있습니다.즉, 엔터티가 수정되지 않더라도 엔터티와의 작업을 잠그려고 하지만 이 엔터티와 관련하여 다른 엔터티가 수정될 수 있습니다.
- 예:우리는 책과 선반이라는 실체를 가지고 있습니다.책을 책꽂이에 추가할 수 있지만 책꽂이에 대한 참조가 없습니다.이 트랜잭션이 종료되기 전에 책이 다른 거래로 인해 다른 선반에 들어가지 않도록 책을 선반으로 옮기는 작업을 잠그는 것이 합리적입니다.이 작업을 잠그려면 책이 아직 책꽂이에 있을 필요가 없기 때문에 현재 책꽂이 엔티티를 잠그는 것만으로는 충분하지 않습니다.또한 대상 책장을 모두 잠그는 것은 의미가 없습니다. 거래마다 다를 수 있기 때문입니다.우리의 경우 변경되지 않더라도(책꽂이에 대한 참조가 포함되지 않음) 유일하게 타당한 것은 책 개체 자체를 잠그는 것입니다.
LockModeType.PESSIMISTIC_READ
- 는 이모는다유사다니합음과드와 합니다.
LockModeType.PESSIMISTIC_WRITE
그러나 한 가지 점에서는 다릅니다. 어떤 트랜잭션에 의해 동일한 엔티티에 쓰기 잠금이 설정될 때까지 엔티티 읽기를 차단하지 않아야 합니다.또한 다음을 사용하여 다른 트랜잭션을 잠글 수 있습니다.LockModeType.PESSIMISTIC_READ
WRITE 잠금과 READ 잠금의 차이점은 여기(ObjectDB)와 여기(OpenJPA)에 잘 설명되어 있습니다.엔티티가 다른 트랜잭션에 의해 이미 잠겨 있는 경우 이를 잠그려고 하면 예외가 발생합니다.이 동작은 예외를 던지고 트랜잭션을 롤백하기 전에 잠금이 해제될 때까지 잠시 기다리도록 수정할 수 있습니다.이를 위해 다음을 지정합니다.javax.persistence.lock.timeout
예외를 던지기 전에 대기할 시간(밀리초)과 함께 힌트를 제공합니다.Java EE 자습서에 설명된 대로 여러 수준에서 이 작업을 수행하는 방법은 여러 가지가 있습니다.
LockModeType.PESSIMISTIC_WRITE
- 은 이은더강버다니전의 더 강한 입니다.
LockModeType.PESSIMISTIC_READ
.제언WRITE
잠금이 설정되어 있습니다. JPA는 데이터베이스의 도움으로 엔티티를 읽기 위한 다른 트랜잭션을 방지할 것입니다.READ
잠그다. - JPA 제공업체에서 기본 DB와 협력하여 이를 구현하는 방법은 규정되어 있지 않습니다.은 오라클과 .
READ
잠그다.SELECT...FOR UPDATE
그것은 정말로 오히려.WRITE
잠금. 사용자 정의 "소프트"를 구현하는 대신 최대 절전 모드에 있는 버그일 수도 있고 결정일 수도 있습니다.READ
자물쇠, "잠금"WRITE
대신 잠금이 사용됩니다.이것은 대부분 일관성을 깨뜨리지는 않지만 다음과 같은 모든 규칙을 유지하지는 않습니다.READ
잠금장다로 를 할 수 . 간단한 테스트를 실행할 수 있습니다.READ
할 수 잠금 및READ
동일한 엔티티에 잠금이 설정됩니다.이것은 가능해야 하는 반면, 그것은 가능하지 않습니다.WRITE
- 잠금 모드 유형.비관적_FORCE_증분
- 이것은 거의 사용되지 않는 또 다른 잠금 모드입니다.하지만, 이것은 당신이 결합할 필요가 있는 옵션입니다.
PESSIMISTIC
그리고.OPTIMISTIC
기계 장치일반 사용PESSIMISTIC_WRITE
다음 시나리오에서 실패할 수 있습니다.- 트랜잭션 A가 낙관적 잠금을 사용하고 엔티티 E를 읽습니다.
- 트랜잭션 B가 엔티티 E에 대한 쓰기 잠금을 획득합니다.
- 트랜잭션 B가 E 잠금을 커밋하고 해제합니다.
- 트랜잭션 A가 E를 업데이트하고 커밋합니다.
- 의해 버전 , B.의 변경 을 덮어쓰지 못하게 것은 .단계에서 버전 열이 트랜잭션 B에 의해 증가하지 않는 경우, A가 B의 변경 사항을 덮어쓰는 것을 막을 수 있는 것은 아무것도 없습니다. 모드 금드 모잠
LockModeType.PESSIMISTIC_FORCE_INCREMENT
가 강제로 가 트잭션 B가강버가번업트고하 A하록합다로 실패하도록 .OptimisticLockException
B가 비관적인 잠금을 사용했음에도 불구하고.
- 잠금 모드 유형.없음.
- 엔티티가 버전 필드를 제공하지 않는 경우 기본값입니다.사용하도록 설정된 잠금이 없음을 의미합니다. 충돌은 최선을 다해 해결되며 검색되지 않습니다.트랜잭션 외부에서 허용되는 유일한 잠금 모드입니다.
언급URL : https://stackoverflow.com/questions/33062635/difference-between-lockmodetype-jpa
반응형
'programing' 카테고리의 다른 글
안드로이드용 이클립스에서 로그캣/콘솔을 활성화하는 방법은 무엇입니까? (0) | 2023.05.22 |
---|---|
VB.NET에서 사용하는 방법? (0) | 2023.05.22 |
소멸자에서 이벤트 핸들러를 제거해야 합니까? (0) | 2023.05.22 |
다른 NoSQL 데이터베이스와 관련하여 DynamoDB의 장단점은 무엇입니까? (0) | 2023.05.17 |
명령줄을 사용하여 지정된 경로에서 node_modules 폴더를 재귀적으로 삭제합니다. (0) | 2023.05.17 |