2012-05-22 1 views
3

Grails의 update 액션은 먼저 업데이트 할 객체의 버전을 확인한 다음 업데이트합니다. Grails의 어떤 부분이 버전을 확인하고 객체를 업데이트하는 동안 다른 요청에 의해 객체가 업데이트되지 않도록 보장합니까?Grails : 버전 체크와 업데이트가 원자 적 (atomic)인지 확인하는 것은 무엇입니까?

업데이트 :

예, 최대 절전 모드 개체를 구원이 때 버전을 확인하고 예외가 낙관적 잠금이 실패 발생합니다. 그리고 최대 절전 모드로 업데이트가 원자 단위인지 확인합니다. 그러나

grails 생성 된 업데이트 방법을 살펴보면 grails가 먼저 두 번 확인한 다음 (내 point of view)는 예외를 처리 할 준비가되어 있지 않습니다. update 메소드가 이미 올바른 버전을 확인한 후에 최대 절전 모드로 예외가 발생할 가능성은 적지 만 나에게는 가능할 것으로 보인다.

그렇다면 저장을 시도하고 예외를 catch하는 것으로 충분하지 않습니까?

+1

좋은 질문에 잠금 볼 수 있지만 컨트롤러에 수동으로 확인해야합니다. 당신이 구글이라면 엄청난 정보 일 것입니다 ... – marko

답변

3

최대 절전 모드 레이어에서 관리합니다. 그것은 'optimistic locking'이라고 불리며 기본적으로 알려진 버전의 객체 만 업데이트합니다. 마찬가지로 :

UPDATE SET 
    %... fields ...%, 
    version = version + 1      --update version to a new value 
WHERE 
    id = %obj id%        --current object 
    AND version = %previous obj version%`  --last known version 

그리고 업데이트 실패 던져 예외 (BTW,이 순간에 그것은 대부분의 경우에 당신은 당신의 갱신을 잃고,이 오류를 복구하기 어렵다). 당신이 데이터가 저장되어 있는지 확인하려면

, 데이터 저장을 억지로 (및 저장/validtion 오류 확인) :

try { 
    if (!obj.save(flush: true)) { 
     // validation error 
    } 
} catch (OptimisticLockingFailureException e) { 
    // not saved 
} 

또는 잠금 데이터를 업데이트하기 전에. 동시 업데이트가 많은 경우에만 유용합니다.

MyDomain obj = MyDomain.lock(params.id) //now it's locked for update 
// update fields 
obj.save() 

은 그것을 수행하는 트랜잭션 상태의 I는 서비스에 맞춰, GORM에 대한 자세한 내용은 http://grails.org/doc/latest/guide/GORM.html#locking

+0

hm. 권리. 그래서 예외가 발생하지만, grails에 의해 생성 된 컨트롤러 코드를 살펴 본다면 자세한 내용은 내 업데이트를 참조하십시오 ... – rdmueller

관련 문제