Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Откат транзакции 
:(
    Опции темы
mr.Anderson
Дата 24.12.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



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

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

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

Вопрос такой: а как откатить эту транзакцию по требованию пользователя? В MSDN я нашел следующее:
Цитата
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.

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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Экскалупатор
Дата 24.12.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



а если просто закрыть транзакцию не вызывая метод AcceptAllChanges()?
PM MAIL ICQ   Вверх
jonie
Дата 24.12.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



а я вот не понял зачем так делать вообще..
чем плохо:
Код

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


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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mr.Anderson
Дата 25.12.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



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

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

CREATE PROC RollbackTransaction
AS
ROLLBACK TRAN

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

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

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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
jonie
Дата 25.12.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



Цитата

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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 25.12.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



а почему это не подходит?

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

ROLLBACK TRANSACTION (Transact-SQL)

Transaction.Rollback - метод 
PM MAIL ICQ   Вверх
jonie
Дата 25.12.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.