트랜잭션 RDBMS 사용에 익숙하지만 트랜잭션이 실패 할 경우 내 메모리 데이터의 변경 사항을 롤백하는 방법은 무엇입니까? 데이터베이스를 사용하지 않는다면 어떨까요?메모리 내 프로세스를 트랜잭션 화하려면 어떻게해야합니까?
여기에 인위적인 예입니다 : 내 예에서
public void TransactionalMethod()
{
var items = GetListOfItems();
foreach (var item in items)
{
MethodThatMayThrowException(item);
item.Processed = true;
}
}
, 어떻게 든 롤백 할 목록의 항목에 대한 변경을 할 수 있습니다,하지만 난이 어떻게 달성 할 수 있습니까?
나는 "소프트웨어 트랜잭션 메모리"에 대해 알고 있지만 그것에 대해 많이 알지 못하며 상당히 실험적으로 보입니다. 나는 "compensatable transactions"개념을 알고 있지만 do/undo 코드를 작성하는 오버 헤드가 발생합니다.
Subversion은 "정리"명령을 실행하여 작업 복사본을 업데이트하는 중 오류를 처리하는 것으로 보입니다.
아이디어가 있으십니까?
UPDATE : 커밋에 원본 데이터의 사본에
일 업데이트 :
Reed Copsey 포함 an excellent answer을 제공합니다.
이 더 내 질문에 한 단계 소요 - 오류가 커밋 동안 어떤 일이 발생하는지 경우? 우리는 커밋을 즉각적인 작업이라고 생각하기는하지만 사실 많은 데이터를 많이 변경하는 경우가 있습니다. 커밋이 적용되는 동안 어쩔 수없는 일, 예 : OutOfMemoryException
이 발생하면 어떻게됩니까? 하나는 롤백 옵션에가는 경우 롤백 동안 예외 이 있는지 역설적으로에
UPDATE 2 Alex에서
answer는 좋은 제안했다 : 즉 하나가 다른 목적은, 다음에, 커밋 단계 단순히 새로운 객체를 통해 현재 오브젝트에 대한 참조를 변화 갱신한다. 그는 당신이 변경 한 객체가 실제로 수정 된 객체의 목록이라는 제안을하기 위해 나아갔습니다.
, 당신은 잠금 처리합니까?
var customers = new Dictionary<CustomerKey, Customer>();
지금, 당신은 어떻게 잠금 및 전체 목록을 교체하지 않고 변경 사항을 적용 할, 고객들 중 일부를 변경하려면 : 당신은 고객의 목록을 상상해? 예 :
var customerTx = new Dictionary<CustomerKey, Customer>();
foreach (var customer in customers.Values)
{
var updatedCust = customer.Clone();
customerTx.Add(GetKey(updatedCust), updatedCust);
if (CalculateRevenueMightThrowException(customer) >= 10000)
{
updatedCust.Preferred = true;
}
}
커밋하는 방법은 무엇입니까?이 (알렉스의 제안은) 목록 참조를 교체하는 동안 모든 고객 잠금 의미합니다 :
lock (customers)
{
customers = customerTx;
}
반면 I 루프를 통해 원래 목록에서 참조 수정, 그것은 원자하지 않은 그리고 파울 떨어지면 "
foreach (var kvp in customerTx)
{
customers[kvp.Key] = kvp.Value;
}
그래, 내 질문의 핵심은 그 커밋/롤백 단계에서 일어나는 일이다. 커밋 중에 예외가 *있는 경우는 어떨까요? 그렇다면 부분적인 변화가있었습니다. 데이터를 오브젝트 목록에 강제로 넣을 수는 있지만, 잠긴 시나리오로 들어가서 질문을 업데이트했습니다. 나는 실제 커밋/롤백 작업 자체를 실제로 확대하는 것에 대해 이야기하고 있습니다. ** 실패한 경우 ** 어떻게 대처하는지보십시오. –
여기에는 많은 옵션이 있습니다. 일반적인 커밋/롤백 스키마에 대한 데이터베이스 이론과 연습을 살펴 보겠다.하지만 전체 복사본 작업을 수행하고 마지막에는 참조를 전환하거나 전체 개체 (예 : 고객 잠금)를 잠그는 등의 작업을 수행하는 경우가 많습니다. , 그것은 거대한 분야입니다. 구체적인 질문없이 자세하게 설명하기는 어렵습니다. –