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

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

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

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

Добавлено: Сб 09 май 2020 22:24
Akella
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

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

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

wbr, Oleg
Devart Team

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

Добавлено: Пт 15 май 2020 07:09
Akella
Да, разобрался уже, спасибо.

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

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

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

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

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