2012-06-14 4 views
0

ODAC (Entity Framework 4)로 프로그래밍 할 때 안전하게 데이터를 업데이트하는 방법을 알고 싶습니다.
EF4 (ORACLE)에서 동시성을 처리하는 방법

void DescreaseInventory(int id, int qty){ 
    var order = (from o in context.Orders where o.ID ==id select o).FirstOrDefault; 
    if(order != null){ 
    if(((Order)order).Qty < qty) 
     throw new ApplicationException("Not Enough Inventory!!"); 
    else 
     ((Order)order).Qty -= qty; 
    } 
    else{ 
    //...some code... 
    } 
    //will content.savechange 
} 

이 코드는 경쟁 조건이 발생하면 (검사 수량을 회피) 위험 할 것입니다. 이 작업을 올바르게 수행하는 방법을 누가 알 수 있습니까?

EDIT : 이제 EF4는 열을 추적 토큰으로 만드는 메커니즘을 제공합니다. 그러나 oracle DB (9i)에서 이러한 종류의 열을 어떻게 만들 수 있습니까? 적절한 컬럼 유형은 무엇입니까?

답변

1

낙관적 동시성 = 데이터베이스에서 rowversion 또는 timestamp 열을 사용합니다. 이러한 컬럼은 데이터베이스에 의해 유지 보수되며 레코드가 갱신 될 때 자동으로 값을 변경합니다. 동시성 검사를 위해 이러한 열을 사용하도록 EF 모델을 올바르게 구성하면 몇 가지 문제점을 피할 수 있습니다.

한 프로세스가 주문을 받으면 현재 시간 소인을로드하고 레코드를 저장하려고하면 타임 스탬프가 업데이트 할 Where 조건의 일부가됩니다. 그 동안 주문이 다른 프로세스에 의해 변경된 경우 업데이트 할 레코드를 찾지 못하고 예외가 발생합니다. 실제 상태 및 실제 시간 소인을 얻기 위해 데이터베이스에서 데이터를 새로 고쳐서 예를 들어 qty를 다시 계산하거나 해결을 위해 사용자에게 전달하여 이러한 예외를 처리해야합니다.

+0

다음 단계에 대해 감사드립니다. DB에 트리거를 정의하면 트리거가 행에서 변경이 발생하면 타임 스탬프 열을 업데이트합니다. Entity 클래스의 상응하는 필드의 ** 동시성 모드 ** 속성을 ** Fixed **로 설정하십시오. – user622851

+0

언급 한 유형을 사용하는 경우 트리거가 필요하지 않습니다. DB가 자동으로 그렇게 할 것입니다. –

+0

고맙습니다. 한번 시도해 보시면 다시 게시됩니다. – user622851

관련 문제