Как правильно работать с транзакциями

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Как правильно работать с транзакциями

Сообщение Akella » Чт 07 июн 2012 13:03

Приветствую.
DXE2, MySQL 5.1.62-cll, UniDAC 4.6.1

Не могу понять, как правильно работать с транзакциями у UniDAC.

при открытии формы:

Код: Выделить всё

    
//qDatas - это TUniQuery

qDatas.ParamByName('id_ads').AsInteger := id_ad;
qDatas.UpdateTransaction.StartTransaction;
qDatas.Open;

// после OPEN пробовал
//    qDatas.UpdateTransaction.StartTransaction;

изменяю данные в таблице (прямо в гриде)
На кнопку Отмена повешен код

Код: Выделить всё

  qDatas.UpdateTransaction.Rollback;

Нажимаю кнопку Отмена, но данные в таблице меняются, хоть я и вызвал Rollback.

Добавлю.
Эта транзакция (qDatas.UpdateTransaction) лежит отдельно от двух других на форме добавления данных, там же лежит и qDatas.
Т.е. есть как обычно 2 транзакции в датамодуле для Connection.
А есть третья, специально для qDatas.UpdateTransaction.
Форма добавления/редактирования модальная.
Соответственно, компонента TUniTransaction создается и уничтожается при создании и закрытии формы, как и сам набор данных qDatas (TUniQuery).
Транзакция qDatas.UpdateTransaction ни к чему больше не привязана. Только TUniConnection и TUniQuery.

Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Как правильно работать с транзакциями

Сообщение Akella » Чт 07 июн 2012 13:12

Чтобы не создавать новую тему добавлю, что в справке нет описания для const UpdateRecKinds: TUpdateRecKinds

procedure ApplyUpdates; overload; virtual;procedure ApplyUpdates(const UpdateRecKinds: TUpdateRecKinds); overload; virtual;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Как правильно работать с транзакциями

Сообщение AndreyZ » Пт 08 июн 2012 08:50

Спасибо за информацию. Мы добавим описание переменной UpdateRecKinds и набора TUpdateRecKinds в документацию всех DAC продуктов.

Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Как правильно работать с транзакциями

Сообщение Akella » Пт 08 июн 2012 09:05

А по первому вопросу что-нибудь проясните?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Как правильно работать с транзакциями

Сообщение AndreyZ » Пн 11 июн 2012 08:07

MySQL не поддерживает множественные транзакции (для чего служат свойства Transaction и UpdateTransaction), поэтому для работы с транзакциями Вам следует использовать методы StartTransaction, Commit и Rollback компонента TUniConnection. Пример:

Код: Выделить всё

UniQuery.Connection := UniConnection;
UniQuery.SQL.Text := 'select * from tablename';
UniQuery.Open;
UniConnection.StartTransaction;
try
  UniQuery.Edit;
  UniQuery.FieldByName('fieldname').AsString := 'test';
  UniQuery.Post;
  UniConnection.Commit;
except
  UniConnection.Rollback;
end;
Также заметьте что MySQL поддерживает транзакции только для механизмов хранения InnoDB и BDB ( http://dev.mysql.com/doc/refman/5.0/en/ ... gines.html ). Проверьте что Ваши таблицы используют один из них.

Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Как правильно работать с транзакциями

Сообщение Akella » Пн 11 июн 2012 09:43

Спасибо.

Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Как правильно работать с транзакциями

Сообщение Akella » Чт 02 авг 2012 10:19

UniQuery.Open;
UniConnection.StartTransaction;
А можно ли делать так (наоборот)?
1. UniConnection.StartTransaction;
2. Куча изменений в цикле в разных таблицах, много раз append/edit/post
3. commit или rollback в случае Exeption или обрыва связи.



Дело в том, что есть процедура, которая в цикле читает данные из одной таблицы, добавляет в другую таблицу записи (insert), в первой и в третьей таблице делает изменения (edit). Цикл длинный (обработка нескольких тысяч записей), программа работает через интернет, поэтому может быть обрыв связи или программа подвиснет.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Как правильно работать с транзакциями

Сообщение AndreyZ » Чт 02 авг 2012 13:49

Для ситуации которую Вы описали Вы можете использовать следующий код:

Код: Выделить всё

UniConnection.StartTransaction;
try
  // любое количество изменений
  UniConnection.Commit; // принять все изменения
except
  UniConnection.Rollback; // откат всех изменений в случае любой ошибки
end;

Akella
Сообщения: 175
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Как правильно работать с транзакциями

Сообщение Akella » Чт 02 авг 2012 14:28

Т.е. можно вначале стартовать транзакцию, а потом открывать датасеты, так?

Просто у Вас в примере вначале открывается датасет, а потом стартуется транзакция.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Как правильно работать с транзакциями

Сообщение AndreyZ » Чт 02 авг 2012 14:54

Т.е. можно вначале стартовать транзакцию, а потом открывать датасеты, так?
Да.

AnViSe
Сообщения: 9
Зарегистрирован: Чт 06 дек 2012 09:35

Re: Как правильно работать с транзакциями

Сообщение AnViSe » Вт 27 авг 2019 10:24

Прошу прощения за подъем старой темы.
Хотел узнать поддерживается ли каскад транзакций.
Типа:

Код: Выделить всё

UniConnection.StartTransaction;
try
  //Изменяем мастер таблицу
 UniConnection.StartTransaction;
 try
  // Изменяем подчиненную таблицу
  UniConnection.Commit; // принять все изменения в подчиненной
 except
  UniConnection.Rollback; // откат изменений в подчиненной в случае любой ошибки
 end;
 UniConnection.Commit; // принять все изменения в мастер
except
 UniConnection.Rollback; // откат изменений в мастер в случае любой ошибки
end;

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как правильно работать с транзакциями

Сообщение ViktorV » Пт 30 авг 2019 13:06

Пожалуйста, укажите точную СУБД с которой вы работаете.

AnViSe
Сообщения: 9
Зарегистрирован: Чт 06 дек 2012 09:35

Re: Как правильно работать с транзакциями

Сообщение AnViSe » Чт 05 сен 2019 13:30

ViktorV писал(а):
Пт 30 авг 2019 13:06
Пожалуйста, укажите точную СУБД с которой вы работаете.
Oracle 12c

MaximG
Devart Team
Сообщения: 105
Зарегистрирован: Пн 06 июл 2015 12:51

Re: Как правильно работать с транзакциями

Сообщение MaximG » Вт 10 сен 2019 12:36

Для реализации описываемого Вами поведения с помощью ODAC Вы можете воспользоваться методами TOraSession.Savepoint : https://www.devart.com/odac/docs/devart ... tring).htm

и TOraSession.RollbackToSavepoint : https://www.devart.com/odac/docs/devart ... tring).htm

AnViSe
Сообщения: 9
Зарегистрирован: Чт 06 дек 2012 09:35

Re: Как правильно работать с транзакциями

Сообщение AnViSe » Вт 10 сен 2019 14:19

MaximG писал(а):
Вт 10 сен 2019 12:36
Для реализации описываемого Вами поведения с помощью ODAC Вы можете воспользоваться методами TOraSession.Savepoint : https://www.devart.com/odac/docs/devart ... tring).htm
и TOraSession.RollbackToSavepoint : https://www.devart.com/odac/docs/devart ... tring).htm
Здесь речь идет об UniDAC.
Но если этот метод будет работать и на UniDAC подключенном к серверу Oracle, то спасибо.

Ответить