2015-03-09 3 views
0

я стараюсь использовать TransactionScope таким образом:TransactionScope с несколькими сделок внутри

using (TransactionScope ts = new TransactionScope()) 
    { 
    DAL.delete(); 
    DAL.create();   
    ts.Complete(); 
    } 

где я независимый DAL (Data Access Layer) модуль, чтобы сделать операции с базами данных. Каждая операция типа delete(), create() является атомарной, т. Е. Все они совершаются путем вызова.

Я пробовал этот код, чтобы объединить эту две операции вместе как транзакцию. И независимо от того, писал ли я ts.Complete(); все они привязаны к базе данных, и откат не происходит.

Как это сделать в этом случае? Благодарю.

+0

Вы попробовали то же самое с ts.Rollback()? – Ako

+0

Какая база данных и структура доступа к данным вы используете? Поддерживает ли он области транзакций? –

+0

, если вы используете 'Sql Server', обратитесь к [MSDN TransactionScope Class] (https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope%28v=vs.110%29. aspx) найдено здесь – MethodMan

ответ

0

TS создает внешнюю транзакцию, которую ваш уровень DAL будет автоматически забирать. Ваш код подразумевает, что вы хотите, чтобы delete и create считались атомной операцией. Если вы хотите, чтобы они были независимыми, создайте еще один блок TS после первого и переместите свой оператор создания.

Если вы хотите откат, вам нужно оставить блок использования без вызова «Завершить» в области видимости, обычно это происходит, потому что один из ваших методов DAL выдает исключение.