1

메소드의 트랜잭션은 메소드의 인수 인 변수를 포함하지 않습니다. 내 응용 프로그램에서 다른 모델의 변경없이 entity이 증가되기 때문에. 엔티티의 속성 x 위의 예에서 NDB의 트랜잭션에는 메소드의 인수가 포함되어 있지 않습니다.

@ndb.transactional(xg=true) 
def method(entity): 
    # `entity` is a datastore entity 

    # Transaction works here 
    Model.foo() 
    # ...here too 
    Model.bar() 

    # But not here! Always incremented. 
    entity.x += 1 
    entity.put() 

는 트랜잭션이 실패하는 경우에도 증가한다.

맞습니까?

+0

변수가 참조되지 않으면 오류가 발생합니다. 트랜잭션 내부에서 엔티티가 시작되지 않습니다. 이온. A 키를 전달하여 오브젝트가 트랜잭션의 일부가되도록 가져와야합니다. –

+0

그래서 ** 트랜잭션 내부에서이'entity = key.get()'**를 수행 할 때 엔티티가 보호됩니까? – Graduate

+0

예, @dragonx answer를 참조하십시오. –

답변

3

예. 엔티티 get()이 트랜잭션 외부에 있었으므로 롤백 할 가치가 없습니다 (트랜잭션은 엔티티의 이전 값을 알지 못합니다.) 또한이 트랜잭션이 실제로 엔티티 x를 1 씩 증가시키려는 경우, 트랜잭션 일관성을 제공하지 못함

엔티티 x = 1을 상상해보십시오.이 트랜잭션은 잠재적으로 시작될 수 있으며 동일한 요청에 대해 작동하는 두 번째 요청이 동시에 실행될 수 있습니다. 두 가져 오기가 트랜잭션 외부에 있기 때문에, 둘 다 1을 읽으면 x가 2로 증가하고 2로 증가하고 3이어야하지만 2로 저장됩니다. get()은 트랜잭션 외부에 있으므로 보호되지 않습니다.

+0

그래서'entity = entity.key(). get()'을 사용하여 트랜잭션에 넣을 수 있습니까? – Graduate

+0

예. Model.foo() 또는 Model.bar()가 어떤 작업을 수행하는지 알지 못하지만 엔티티 내에서 데이터 저장소를 가져 오는 것은 항상 트랜잭션 시작시 데이터 저장소의 상태를 반영한다는 점을 명심해야합니다. 따라서 Model.foo() 또는 Model.bar()가 엔티티를 변경하면 가져 오기에 이러한 변경 사항이 반영되지 않습니다. – dragonx

관련 문제