Re[3]: Update PrimaryKey или первоначальное значение
От: Блудов Павел Россия  
Дата: 13.04.06 01:21
Оценка:
Здравствуйте, krupoderov, Вы писали:

K>В случае транзакции мы просто откатываем и объект.


Просто? Просто не получится. Давайте рассмотрим такой сценарий:

Smth = db.SelectByKey(); // Smth.Key = Шило.
db.BeginTransaction();
Smth.Key = Мыло
db.Update(); // Шило => Мыло
db.Transaction.Save("SavePoint");
Smth.Key = Водка
db.Update(); // Мыло => Водка
db.Transaction.Rollback("SavePoint");  Водка => Мыло
Smth.Key = Носки
db.Update(); // Мыло => Носки
db.RollbackTransaction();  Носки => Шило


Т.е. нужно хранить предудущее значение и стек значений для каждой вложенной транзакции. И при откате находить в этом стеке нужные значения.

Причём логика первый пришёл — последний ушёл тут не годится. Вот такой код вполне корректен:
db.BeginTransaction("Transaction");
// ...
db.Transaction.Save("SavePoint");
// ...
db.RollbackTransaction("Transaction");

SavePoint просто идёт в лес. И в приведённом выше примере откат должен произойти сразу на Шило, минуя Мыло.

Важное замечание.

Сейчас транзакции в BLToolkit'е не имеют save point'ов. Хотя и SqlTransaction и OracleTransaction их имеют.
Но это не значит, что Игорь их туда никогда не добавит
... << RSDN@Home 1.2.0 alpha rev. 642>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.