2017-03-20 1 views
2

낙관적 잠금 주석이 작동하지 않습니다.스프링 데이터에서 낙관적 잠금을 해제하는 방법 JPA

public interface TestRepository<TestEntity, Long> extends JpaRepository<Version, Long> { 
    @Lock(LockModeType.NONE) 
    TestEntity findByName(String name); 
} 

그래서, 내가 전화하려고 :

entityManager.refresh(); 

그것은 작동하지만, 해결의

@OptimisticLocking(type = OptimisticLockType.NONE) 
public class TestEntity { 
    .... 
} 

@Lock 주석 중 하나가 작동하지 않습니다. 낙관적 잠금 주석이 작동하지 않고 최신 데이터를 DB 행 (개체)를 업데이트하는 가장 좋은 방법은 무엇 왜

EntityManager em = sharedEntityManagerBean.getObject(); 
em.refresh(testEntity, LockModeType.OPTIMISTIC); 
testRepository.save(testEntity); 

당신이 말해 줄 수 있을까요?

+0

나는 이걸 http://springinpractice.com/2013/09/14/optimistic-locking-with-spring-data-rest 도움을 줄 수 있다고 가정합니다. – Reborn

답변

2

OptimisticLockType.NONETestEntity의 기본 낙관적 잠금 메커니즘을 비활성화합니다.

속성을 @MappedSuperclass 또는 @Inheritance이라는 주석이있는 기본 클래스에서 상속 한 경우에만 유용합니다.

이 엔티티에 대해 낙관적 잠금을 원하지 않는다면 @Version 속성을 제거하면됩니다. 그러나 이는 일반적으로 lost updates으로 이어질 수 있으므로 나쁜 아이디어입니다.

어쩌면 versionless optimistic locking을 사용하면 중첩되지 않는 속성 chanages에 의해 생성 된 충돌 비율을 낮출 수 있습니다.

다시 말해서 @Lock(LockModeType.NONE)은 기본적으로 암시 적이므로 유용하지 않습니다. 당신도 그것을 제거 할 수 있습니다. 이는 acquiring an explicit logical or physical lock에만 해당됩니다.

낙관적 잠금이 설명하지 않은 문제를 일으킨다 고 생각하는 잘못된 결론을 내리고 있습니다.

따라서, 당신은 분명 있도록 적절한 방식으로 질문을 공식화해야합니다

  1. 당신이 해결하려고하는 실제 문제가 무엇입니까?
  2. 낙관적 잠금을 원하십니까?
  3. 저장을 수행 할 때 특별한 예외가 있습니까?
+0

@Version 속성을 제거했지만 엔티티 잠금 모드가 있습니다. 낙관적 인. --- 1. 다중 요청에서 낙관적 인 잠금 예외가 있습니다. 2. 애플리케이션 관리 동시성을 사용하고 싶지 않습니다. 3.이 상황에서 테스트 케이스를 업로드했습니다. https://github.com/pilkyoon/optimisticlocking – pilkyoon

+0

MappedSuperclass 어노테이션을 사용한 예제를 참조하면 버전 4.3.0.Final 이전의 Hibernate는 부모 클래스가 Version annotated 속성을 가지고있는 경우 OptimisticLockType 설정을 무시한다는 것을 알았다. – pbartosz

+0

버그가 수정되었을 수도 있습니다. –

관련 문제