2011-08-26 9 views
8

Java Persistent/Locking wikibooks *에 따르면 잠금을 처리하는 가장 좋은 방법은 낙관적 잠금 오류/예외를 사용자에게보고하는 것입니다.자물쇠 (JPA)를 어떻게 다루는가?

문제는 확장 할 수 없다는 것입니다. 동일한 작업으로 잠금을 유발할 가능성이 많은 사용자가 있다고 가정합니다. 사용자는 잠금 오류 메시지에 대해 신경 쓰지 않습니다. 간단히 말해서

:

  • 가장 좋은 방법은 모든 잠금을 해제하는 것입니다?
  • 가장 좋은 방법은 오류 잠금 메시지를 사용자에게보고하는 것입니다. 그러나 사용자는 작동 될 때까지 자신의 행동을 다시 시도해야합니다!
  • 가장 좋은 방법은 잠금이 없을 때까지 트랜잭션을 다시 시도하는 것입니다.

*

처리 낙관적 잠금 예외

불행히도 프로그래머는 자주 자신의 좋은을 위해 너무 영리 될 수 있습니다. OptimisticLockException이 발생할 때 수행 할 작업은 낙관적 잠금을 사용할 때 발생하는 첫 번째 문제입니다. 친숙한 이웃 슈퍼 프로그래머의 일반적인 응답은 예외를 자동으로 처리하는 것입니다. 그들은 단지 새로운 트랜잭션을 만들고, 객체를 새로 고침하여 버전을 재설정하고, 데이터를 다시 객체에 병합하고 다시 커밋합니다. Presto 문제가 해결 되었습니까?

이것은 실제로 처음부터 모든 잠금 지점을 무효화합니다. 이것이 원하는 경우 잠금을 사용하지 않을 수도 있습니다. 불행히도, OptimisticLockException은 거의 자동으로 처리되지 않아야하며, 사용자는이 문제점에 대해 정말로 귀찮게해야합니다. 충돌을 사용자에게보고하고 "미안하지만 편집 충돌이 발생하여 작업이 다시 수행되어야합니다"라고 말하거나 최상의 경우 객체를 새로 고치고 사용자에게 현재 데이터를 표시하고 그들이 제출 한 데이터는 적절한 경우 두 데이터를 병합하는 데 도움이됩니다.

일부 자동화 된 병합 도구는 충돌하는 두 버전의 데이터를 비교하고 개별 필드가 충돌하지 않으면 데이터가 사용자의 도움없이 자동으로 병합됩니다. 이것은 대부분의 소프트웨어 버전 제어 시스템이하는 일입니다. 안타깝게도 사용자는 일반적으로 .java 파일의 두 버전이 동일한 코드 행을 변경하지 않았기 때문에 충돌이없는 것을 의미하지는 않으며, 첫 번째 사용자가 다른 사용자가 참조 할 메소드를 추가하는 방법과 일반적으로 야간 빌드를 너무 자주 중단시키는 몇 가지 가능한 문제가 있습니다.

+0

[JPA의 잠금 시스템을 해제하는 방법] (http://stackoverflow.com/questions/7201940/how-to-disable-the-lock-system-of-jpa), 같은 저자. –

+2

나는 그것을 무효로하는 방법을 묻기 때문에 복제되지 않았다고 말하고, 다른 하나는 잠금이있는 전략을 요구한다. – edutesoy

답변

10

일부 수정을 원했기 때문에 사용자가 메시지에 신경을 쓰고 수정되지 않았습니다. 그러면 페이지를 새로 고침하여 데이터의 새로운 상태를 확인하고 수정 사항을 다시 실행하거나 더 이상 새로운 상태가 주어지지 않아야한다고 결정합니다.

두 명의 사용자가 동시에 엔티티를 수정하는 경우 문제가됩니까? 마지막 수정이 성공하면 변경 사항은 무엇입니까? 문제가있는 경우 낙관적 잠금을 사용하고 문제가 발생하면 사용자에게 알리십시오. 주변에는 방법이 없습니다.

문제가되지 않는다면 낙관적 잠금을 사용하지 마십시오. 마지막 수정은 데이터베이스의 제약 조건을 깨지 않으면 항상 승리합니다.그러나 동시 사용자가 동일한 데이터를 수정하면 항상이 예외로 이어집니다 (예 : 다른 사용자가 다른 사용자가 동일한 엔터티에 수정을 제출하기 전에 일부 사용자가 엔터티를 삭제할 수 있기 때문).

  • 중 하나는 그것이 성공
  • 또는 수정을 할 단지 불가능하기 때문에, 다시 실패합니다,하지만 낙관적 잠금을 가지고있는 점을 물리 칠 것입니다 :

    다시 시도를 선택할 수 없습니다 처음.

자동차의 비유로 문제를 설명 할 수 있습니다. 당신이 속도 제한을 깨지 않도록하기 위해 속도 제한기로 자동차를 구입한다고 가정하십시오. 그리고 이제 당신은 묻습니다. 그러나 속도 제한에 대해서는 신경 쓰지 않습니다. 항상 속도 제한기를 비활성화하면 안됩니까? 당신은 할 수는 있지만 경찰에 잡히면 놀라지 않을 것입니다.

+0

큰 설명 주셔서 감사합니다. –

관련 문제