2012-11-06 4 views
0

재고 관리를해야하므로 제품 양을 수정했을 때 올바른 방법으로 수행해야합니다. 엔터티 프레임 워크 4.0을 사용하고 있습니다엔티티 프레임 워크 동시성 : 트랜잭션 또는 동시성이 고정 되었습니까?

예를 들어, 트랜잭션을 사용할 경우 데이터베이스에서 레코드를로드 할 때 레코드가 차단되어로드 된 금액 인 항목 수를 빼거나 추가 할 수 있습니다. 필요한 것. 그러나이 방법은 데이터베이스의 레코드를 차단하고 성능상의 이유로 레코드를 차단하는 것이 가장 좋은 방법은 아닙니다. 이것은 EF와 거래를 언제 사용해야하는지 묻습니다.

다른 옵션은 레코드가 변경되었는지 감지하기 위해 timespan 열을 사용하여 엔티티 프레임 워크의 동시성을 사용하는 것입니다. 이 경우 레코드가 내로드와 내 업데이트 사이에서 수정되면 동시성의 예외가 발생합니다. 그러나 내 예외 처리기에서 데이터베이스 데이터로 내 컨텍스트를 업데이트하면 새로 고침과 savechanges를 다시 변경할 수 있습니다.

다른 문제는 결국 변경 사항을 저장할 수 있습니다. 예를 들어 10 단위가 있고, 8을 빼고 내 부하와 업데이트 사이에 다른 사람이 5 단위를 빼면됩니다. 제가 8을 빼면 재고가 -3입니다. 이건 불가능 해. 트랜잭션이있는 경우 레코드가로드되고 차단되므로 충분 한 단위가 있는지 확인할 수 있습니다. 그렇다면 하위 트랙을 만들 수 있습니다. 그렇지 않은 경우 예외를 보냅니다.

내 질문에, 나는 EF가 자체적으로 트랜잭션이라는 것을 알고 있지만 EF에도 트랜잭션이 있으므로 어떤 경우에는 유용 ​​할 것입니다. EF와 cocurrency를 언제 사용하고 트랜잭션을 사용해야합니까?

감사합니다. Daimroc.

답변

1

트랜잭션을 동시성 문제를 해결하는 데 사용해서는 안됩니다. 데이터베이스를 차단하지 않으려면 가능한 한 트랜잭션을 짧게 만들어야합니다. 여기에가는 방법은 낙관적 동시성입니다. 데이터베이스 (SqlServer)에서 행을 수정할 때마다 자동으로 변경되는 행 변환 열을 만듭니다. 동시성 토큰으로 사용합니다. 변경 사항을 저장할 때 EF는 엔티티의 값과 비교하여이 값을 확인하고 일치하지 않으면 예외를 throw합니다. SaveChanges의 경우 EF는 일반적으로 둘 이상의 엔티티를 저장하기 때문에 항상 트랜잭션을 만듭니다. 문제가 발생하면 데이터베이스를 원래 상태로 되돌려 야합니다. 그렇지 않으면 손상된 상태가됩니다. 낙천적 동시성을 사용하는 경우 0 미만이되는 것을 방지하려면 행이 수정되어 클라이언트의 검사가 있어야하므로 동시성 토큰이 다를 수 있기 때문에 데이터베이스의 값이 변경되면 저장할 수 없습니다. 충분한. 또는 저장하기 전에 값을 확인할 저장 프로 시저에 엔티티 저장을 매핑 할 수 있으며 저장 후 값이 올바르지 않으면 오류가 반환됩니다.