Страница 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;
изменяю данные в таблице (прямо в гриде)
На кнопку Отмена повешен код
Нажимаю кнопку Отмена, но данные в таблице меняются, хоть я и вызвал 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
Здесь речь идет об UniDAC.
Но если этот метод будет работать и на UniDAC подключенном к серверу Oracle, то спасибо.