Страница 1 из 2

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

Добавлено: Чт 07 июн 2012 13:03
Akella
Приветствую.
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.

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

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

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

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

Добавлено: Пт 08 июн 2012 08:50
AndreyZ
Спасибо за информацию. Мы добавим описание переменной UpdateRecKinds и набора TUpdateRecKinds в документацию всех DAC продуктов.

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

Добавлено: Пт 08 июн 2012 09:05
Akella
А по первому вопросу что-нибудь проясните?

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

Добавлено: Пн 11 июн 2012 08:07
AndreyZ
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 ). Проверьте что Ваши таблицы используют один из них.

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

Добавлено: Пн 11 июн 2012 09:43
Akella
Спасибо.

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

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



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

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

Добавлено: Чт 02 авг 2012 13:49
AndreyZ
Для ситуации которую Вы описали Вы можете использовать следующий код:

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

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

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

Добавлено: Чт 02 авг 2012 14:28
Akella
Т.е. можно вначале стартовать транзакцию, а потом открывать датасеты, так?

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

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

Добавлено: Чт 02 авг 2012 14:54
AndreyZ
Т.е. можно вначале стартовать транзакцию, а потом открывать датасеты, так?
Да.

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

Добавлено: Вт 27 авг 2019 10:24
AnViSe
Прошу прощения за подъем старой темы.
Хотел узнать поддерживается ли каскад транзакций.
Типа:

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

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

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

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

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

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

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

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

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

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

Добавлено: Вт 10 сен 2019 14:19
AnViSe
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, то спасибо.