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

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
MaximG
Devart Team
Сообщения: 114
Зарегистрирован: Пн 06 июл 2015 12:51

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

Сообщение MaximG » Ср 11 сен 2019 16:50

Такая же функциональность доступна и в UniDAC при использовании компонента TUniTransaction : https://www.devart.com/unidac/docs/deva ... action.htm

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

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

Сообщение Akella » Сб 09 май 2020 22:24

AndreyZ писал(а): Пн 11 июн 2012 08:07 MySQL не поддерживает множественные транзакции
Теперь вопрос по СУБД Firebird 3, которая поддерживает множественные транзакции.
Как правильно управлять транзакциями вручную?
Т.е. мне надо открыть транзацию, сделать много изменений и закрыть транзакцию либо откатить все изменения, если возникла ошибка в процессе изменения.

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

var
q: TUniSQL;
begin
...
   q.SQL.Text := 'update table1 set region = :region where id = :id;
    q.Transaction := transSqlExec;// назначаем "пишущую" транзакцию.
    q.Transaction.StartTransaction;// 
    запускаем цикл множественного изменения записей
    for I := 0 to ...
    begin
      q.ParamByName()...
      q.Execute;  
    end;
    
    q.Transaction.Rollback;// отменяю все сделанные изменения
выполняю код, проверяю, а данные в базу записались.
Почему нет отката изменения?


P.S. к UniConnection по умолчанию подключена транзакция "читающая", с параметрами: read;nowait;rec_version;read_committed

oleg0k
Devart Team
Сообщения: 21
Зарегистрирован: Вт 10 мар 2020 17:46

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

Сообщение oleg0k » Чт 14 май 2020 19:28

Добрый день,
проверьте свойство AutoCommit компонента UniConnection. Если оно установлено в True - будет происходить Commit всех транзакций, связанных с данным UniConnection, так как данное свойство имеет более высокий приоритет.
Поведение описано в документации к UniDAC.

wbr, Oleg
Devart Team

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

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

Сообщение Akella » Пт 15 май 2020 07:09

Да, разобрался уже, спасибо.

ЕМНИМ, то если у UniConnection AutoCommit отключен, то не важно в каком состоянии AutoCommit у UniQuery? Нужно всегда самому програмно подтверждать транзакцию даже если AutoCommit включен у UniQuery? Я правильно помню?

oleg0k
Devart Team
Сообщения: 21
Зарегистрирован: Вт 10 мар 2020 17:46

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

Сообщение oleg0k » Пн 18 май 2020 14:06

Добрый день, да. Для контроля над транзакцией вы можете использовать код:

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

UniQuery.Execute;
if UniQuery.Transaction.Active then
  UniQuery.Transaction.Commit; //или Rollback
wbr, Oleg
Devart Team

Закрыто