2013-07-29 7 views
4

Интересно, есть ли простой способ обработки какой-либо транзакции на C#. Скажем, что у нас есть два свойства, и мы хотели бы обновить их значения. Мы могли бы написать:Сделка в чистом C# кодировании

A = GetA(); 
B = GetB(); 

Проблема заключается в том, что если будет сгенерировано исключение при назначении B, то объект будет находиться в inconsistant состоянии, поскольку был обновлен. Мы можем решить эту проблему путем сохранения текущего значения A и ловить исключение при работе с B:

var tempA = A; 
A = GetA(); // A is up to date 
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted 

Даже выше решение не экономить, потому что исключение может быть выброшено, а возвращаясь А, но дело в том, если встроены в механизмы в .NET, что упрощает такие операции?

я мог себе представить такое заявление ниже:

transaction { A = GetA(); B = GetB(); } 

Или код строительства, как:

Transaction.Enter(); 
A = GetA(); 
B = GetB(); 
Transaction.Leave(); 

Перед сделки государственная машина будет храниться и после операции он будет возвращен в случае исключение. В .NET есть что-то подобное?

+0

[Программное обеспечение Transactional Memory] (http://en.wikipedia.org/wiki/Software_transactional_memory)? –

+0

'tempA = GetA(); B = GetB(); A = tempA'? – cHao

+0

@cHao A = tempA maight выдает исключение, так как мы не знаем, как реализован сеттер. –

ответ

8

«TransactionScope не только для баз данных. Каждый компонент, который реализует интерфейс IEnlistmentNotification может участвовать в двухфазной фиксации в области транзакции.

Ниже приведен пример транзакционного хранения в памяти : http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx "

Источник: https://stackoverflow.com/a/2273902/1714342

Я думаю, что вы можете реализовать т его интерфейс IEnlistmentNotification и использовать TransactionScope

4

Вы можете использовать класс TransactionScope.

Пример:

using(var scope = new TransactionScope()) 
{ 
    DoAction1(); 
    DoAction2(); 

    scope.Complete(); 
} 
+0

Вам нужно 'scope.complete()'? Кажется противоречивым понятием концепции 'using'. – basher

+0

вам необходимо пометить транзакцию как завершенную до того, как она будет удалена в конце «использования» для ее совершения, если вы не отметите ее как полную, она будет отката в конце области «использования» , –

2

Там нет встроенной функции для объектных транзакций. Но есть некоторые сторонние библиотеки, которые обеспечивают это для поддержки управления состоянием объекта.

Вы можете взглянуть на этот похожий вопрос.

https://stackoverflow.com/a/1765642/881798

Смежные вопросы