2012-07-04 2 views
2

Google 애플 리케이션 엔진과 NDB에서 초보자입니다. 내 문제는 : 내가 모델에서 1 개체, 이 있다면 나는 충돌을 방지하고자 할 때 2 명 병렬 작업, 코드 예제 :NDB에서 일괄 작업을 수행하는 방법은 업데이트 ndb에 대한 원자 적 또는 잠금 레코드입니다.

class MyModel(ndb.Model) 
    count = ndb.IntegerProperty() 
    def update_value(delta) 
    count=count +delta 

작업 1 :

my_obj1= MyModel.get_by_id(1) 
my_obj1.update_value(10) 
my_obj1.put() 

작업 2 :

my_obj2= MyModel.get_by_id(1) 
my_obj2.update_value(20) 
my_obj2.put() 

2 세션이 2 작업을 병렬로 호출하고 entity (id = 1)의 작업 count = 0보다 먼저 호출하는 경우. 나는 예를 들어 카운트 값에 충돌, 을 방지하려면 : NDB에

operation1: read my_obj1 from entity(id=1) 
operation2: read my_obj2 from entity(id=1) 
operation1: update_value(10) #count =10 
operation2: update_value(20) # count=20 
operation1: put() # save to ndb with count =10 
operation2: put() # save to ndb with count=20 

수 = 20. ndb에서 count = 30의 값이 필요합니다.

제게 해결책을 보여주십시오.

답변

2

여기에 거래를 사용할 수 있습니다. 그러나 그것은 확장되지 않습니다.

+0

감사합니다. 나는 거래를 시도 할 것이다. –

1

lock 개체로 시도하여이 blog이 도움이 될 수 있기를 바랍니다.

+0

클래스 MyModel에 lock을 사용할 수 있으므로이 클래스의 모든 엔티티는 잠금을 기다려야합니다. 응용 프로그램의 속도가 느려집니다. 완성 된 솔루션이 없다면이 시나리오에서 데이터 수정 솔루션을 사용할 수 있습니다. –

관련 문제