2013-09-02 3 views
0

신청서에 IDictionary<TKey, IList<TValue>>이 있습니다.거래 사전

내가 밖으로 가지고 싶어 : N TKEY = 5의 값과 TKEY = 3 m의 값을 사용자와 같은 요청이. 모든 지정된 요소가있는 경우

그러나, 제거는 유일한 장소를해야한다. 사전에 TKey = 5의 n + 3 값이 있지만 TKey = 3 의 m-1 값만 있으면 요소를 제거해야합니다.

이 트랜잭션 동작을 보장하는 가장 좋은 방법은 무엇입니까? 전체 사전을 잠근 다음 모든 것이 존재하는지 확인한 다음 지정된 모든 쿼리가 완료되면 요소를 제거하겠습니까?

어떻게 든 사전을 트랜잭션화할 수있는 방법이 있습니까?

using(var tx = new TransactionScope()) 
{ 
    foreach(var query in queries) 
    // try to remove elements of query -> exception if not possible -> all others are back in place 

    tx.Commit(); // ok, all queries fulfilled, commit now 
} 

아니면 스레드 안전한 방법 TakeFromDictionary(IEnumerable<Query> queriesWhichMustBeFulfilled)을 가지고 사전에 대한 래퍼 클래스를 작성하는 것이 좋습니다 : 뭔가처럼?

가장 좋은 방법은 무엇입니까?

답변

0

쥬발 로이 :-) 과부하되는 것을 표시 할 수있다. 그는이 MSDN 기사에서 자신의 작업을 설명했습니다. http://msdn.microsoft.com/en-us/magazine/cc163688.aspx 코드 예에서 그는 TransactionalDictionary<T,K>이 포함 된 기사와 함께 제공합니다.

var dictionary = new TransactionalDictionary<int, string>(); 
dictionary.Add(1, "A"); 

// #1: committed transaction 
using (var scope = new TransactionScope()) 
{ 
    dictionary.Add(2, "B"); 
    dictionary.Add(3, "C"); 
    dictionary.Add(4, "D"); 
    scope.Complete(); 
} 
Debug.Assert(dictionary[3] == "C"); 

// #2: uncommitted transaction 
using (var scope = new TransactionScope()) 
{ 
    dictionary[1] = "Z"; 

    // transaction is not completed -> rollback to initial state 
    //scope.Complete(); 
} 
Debug.Assert(dictionary[1] == "A"); 
+0

내가 예상했던 것과 정확히 일치하지 않더라도이 답변을 수락했습니다. 당연히 트랜잭션 메모리는 아직 "엔터프라이즈 수준"의 더 많은 라이브러리가 지원할만큼 주류는 아닙니다. –

1

래퍼를 만들고 래퍼의 공용 메서드 내에서 잠금을 처리합니다.

요구 사항이 복잡해지면 사전을 교체 할 수도 있습니다. 호출자가 걱정할 필요없이 한 곳에서 잠금 기능을 구현합니다.

또한 사전 내부 일반적인리스트를 갖는 판독되기 어려우 (new Dictionary<String, IList<Int32>>())는 - 그것은 사전 객체 트랜잭션 지원을 구현 한