Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Откат транзакции


Автор: mr.Anderson 24.12.2010, 16:10
При работе с БД через Entities существует возможность открыть транзакцию, не вызывая метод AcceptAllChanges() у объекта класса ObjectContext. К примеру, так:
Код

private void SaveChanges()
{
    db.SaveChanges(false);
    TransactionOpened = true;    
}

В результате получим открытую транзакцию, которую можно будет воплотить в реальность, вызвав тот самый AcceptAllChanges().

Вопрос такой: а как откатить эту транзакцию по требованию пользователя? В http://msdn.microsoft.com/en-en/library/bb336792(v=VS.90).aspx я нашел следующее:
Цитата
SaveChanges operates within a transaction. SaveChanges will roll back that transaction and throw an exception if any of the dirty ObjectStateEntry objects cannot be persisted.

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

Автор: Экскалупатор 24.12.2010, 16:18
а если просто закрыть транзакцию не вызывая метод AcceptAllChanges()?

Автор: jonie 24.12.2010, 19:09
а я вот не понял зачем так делать вообще..
чем плохо:
Код

using(var tr = new TransactionScope()) {
 db.SaveChanges;
 tr.Compleate(); //или как=то так
}


собственно я думаю можно вернуть эту tr, не вызывая Dispose() для неё...

Автор: mr.Anderson 25.12.2010, 10:02
Экскалупатор, жуть как логично. Вопрос состоял в том, каким образом это сделать))

Появилась еще идея создать на сервере хранимую процедуру, описать ее как-то так:
Код

CREATE PROC RollbackTransaction
AS
ROLLBACK TRAN

И потом звать ее, когда понадобится. Вопрос, повлияет ли это корректно на состояние объекта ObjectContext.

Добавлено через 8 минут и 13 секунд
Поглядел TransactionScope, там есть возможность завершить транзакцию и завершить с индикацией, что все, произошедшее внутри транзакции, выполнено корректно. Значит, как я понял, вызов Dispose() не будет откатывать изменения? А просто "проинформирует" об этом?

Вопрос об откате транзакции все еще открыт.

Автор: jonie 25.12.2010, 11:43
Цитата

Значит, как я понял, вызов Dispose() не будет откатывать изменения? А просто "проинформирует" об этом?
угу, проинформирует... эксепшеном если ты не закрыл либо не отменил транзакцию.

с хранимками не прокатит, по крайней мере в MSSQL, почитайте про scope-ы

Автор: Экскалупатор 25.12.2010, 13:29
а почему это не подходит?

открыл книгу про ADO.NET, раздел транзакции, там написано:
"транзакция фиксируется или откатывается с помощью метода Commit или Rollback объекта транзакции".

http://msdn.microsoft.com/ru-ru/library/ms181299.aspx

http://msdn.microsoft.com/ru-ru/library/system.transactions.transaction.rollback.aspx

Автор: jonie 25.12.2010, 23:38
Экскалупатор, при чем там ado.net ? Если у вас например MSSQL надо читать про scope (область применения) ... в общем на sql.ru  и в книгах лучше пояснят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)