Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
Использую SDAC 7.3.12.
При возникновении ошибки меняется номер транзакции. Это приводит к тому, что данные из предыдущей транзакции исчезают.
procedure TForm1.Button1Click(Sender: TObject);
var
  err: integer;
  b: Boolean;
begin
  Memo1.Clear;
  err := 0;

  con.Server := 'MySqlExpress';
  con.Database := 'test;
  con.Authentication := auWindows;
  con.Connect;
  try
    con.StartTransaction;
    try
      msqry2.Execute;   // Добавляем данные exec dbo.prSetLoadConf
      for b := Low(Boolean) to High(Boolean) do
      begin
        try
          if not b then // При первом проходе сгенерим ошибку
            con.ExecSQL('use [qweqasdasd]'); // <<< Явно ошибка - нет такой базы

          msqry1.Open; // При втором проходе: select  - и нет тут данных
          while not msqry1.Eof do
          begin
            Memo1.Lines.Add(msqry1.FieldByName('inIdLoadConf').AsString);
            msqry1.Next;
          end;
        except
          on E:Exception do
          begin
            inc(err);
            Memo1.Lines.Add(e.Message); // Протоколируем ошибку (База данных 'qweqasdasd' не существует. Убедитесь, что ее имя введено правильно.)
          end;
        end;
      end;
      if (err = 0) then
      begin
        ShowMessage('Execute - ok');
        con.Commit;
      end
      else
        con.Rollback;
    except
      on E:Exception do
      begin
        con.Rollback;
        ShowMessage(e.Message);
      end;
    end;
  finally
    con.Close;
  end;
end;

На скрине из Profiler ниже видно, что после use [qweqasdasd] стартует другая транзакция (191006), у которой TransactionId отличается от той, что я стартовал (190848).
Возможно ли изменить такое поведение? Хотелось бы, чтобы весь код выполнялся в рамках одной транзакции (190848), которую я стартовал.
+

Картинка с другого сайта.
25 май 18, 13:49    [21440157]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
Что-то картинка не вставилась.

К сообщению приложен файл. Размер - 44Kb
25 май 18, 13:52    [21440168]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45919

Автокоммит?..

Posted via ActualForum NNTP Server 1.5

25 май 18, 13:53    [21440181]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
Dimitry Sibiryakov,

У соединения AutoCommit выключен.
Из опций у con: TMSConnection KeepDesignConnected = false. Всё остальное - по умолчанию.
25 май 18, 14:29    [21440399]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
Тут скорее такое поведение: при ошибке происходит роллбак всей транзакции, но т.к. дальше идут операции то стартует новая транзакция.
25 май 18, 14:32    [21440422]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
xact_abort?
25 май 18, 22:54    [21441870]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
да и не грех проверять InTransaction при коммитах и роллбэках
25 май 18, 22:56    [21441874]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
ну и как финал, что мешает в msqry2 выполнить и хранимку и сразу вернуть резалтсет? тогда у вас будет нормальный контроль транзакции внутри хранимки
25 май 18, 22:59    [21441880]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
энди, приведённый пример -- тестовый. На самом деле очень много действий выполняется в рамках одной транзакции. И работа ориентирована на некий флаг - существование записи в определенной таблице.

А флаг InTransaction я проверю после ошибки. и xact_abort тоже.
26 май 18, 00:23    [21442030]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
лучше чтобы транзакция не выполнялась долго, в ее контексте и блокировки и бог его знает что еще происходит. как вариант выполнять запрос не через коннекшн, а через запрос, там тогда можно нормально обработать ошибку и вернуть ее через return, а не райзеррор на клиента как фактически скорее всего срабатывает тут. Попробуйте.
26 май 18, 13:30    [21442541]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
Флаг InTransaction у соединения после ошибки - true. Т.е. ориентироваться на этот флаг нельзя. xact_abort тоже не устраивает.

Работа с базой происходит через запрос.

В рамках транзакции происходит изменение конфигурации системы. Короткую транзакцию (на одно действие) сделать нельзя, т.к. конфигурация системы не может быть частично измененной. При накатывании конфигурации фиксируются ошибки. И если ошибки присутствуют, транзакция откатывается (TMSConnection.Rollback), а список ошибок показывается клиенту для устранения.
Конфигурация может накатываться как вызовом процедур, так и вызовом скриптов. И если в вызовах процедур есть return, то при выполнении скриптов return реализовать не получится.

Проблема в том, что после ошибки, полученной в ходе выполнения скрипта, где-то под капотом SDAC стартует новая транзакция, а предыдущая откатывается полностью.

Поведение, что транзакция полностью откатывается, меня устраивает. Не устраивает, что стартует новая. Я не проверял, но думаю, что если подтвердить транзакцию, то в базе будут только те данные, которые попали в неё в рамках новой транзакции.

Возможно, это фича SDAC. Тогда возможно есть какой-то флаг у соединения, который изменяет такое поведение (старт новой транзакции, если предыдущий запрос завершился по ошибке райзеррор).
28 май 18, 12:25    [21446037]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
попробуй выполнять

con.ExecSQL('use [qweqasdasd]'); // <<< Явно ошибка - нет такой базы


не через TMSConnection, а через TMSQuery
28 май 18, 20:04    [21448207]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
энди, если использовать TMSQuery, а не TMSConnection, то ситуация не меняется, т.к. ошибка в скрипте вызывает raiseerror. И следующий запрос к базе также начинает новую транзакцию.
  msqry1.SQL.Text := 'use [qweqasdasd]';
  msqry1.Execute; // Ошибка


Буду ждать devart. Может быть он прояснит ситуацию.
29 май 18, 09:21    [21448954]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
что-то мне подсказывает что возможно транзакцию откатывает прямо на сервере столкнувшись с raiseerror.
29 май 18, 09:54    [21449060]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
энди
что-то мне подсказывает что возможно транзакцию откатывает прямо на сервере столкнувшись с raiseerror.

То, что транзакция откатывается, это нормально. Странно то, что следующим запросом новая транзакция начинается. И номер у неё новый.
29 май 18, 10:05    [21449089]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2838
goldmi45,

так если старая откачена - то как бы всё. её больше нет. она закончилась откатом. ну и, соответственно, при новом запросе новая поднимается.
29 май 18, 12:29    [21449755]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 898
махаон скорее всего имеет ввиду что не бывает запросов вне контекста транзакции и если старая у тебя завершилась при Raiseerror то новая просто автоматически будет запущена в момент выполнения следующего запроса.
29 май 18, 13:13    [21449954]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
goldmi45
Member

Откуда:
Сообщений: 1034
хмм. Тогда как определить, что началась новая транзакция? Анализировать Exception? Или же есть явный признак?
29 май 18, 13:54    [21450166]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2838
я имею в виду, что после коммита или роллбэка транзакция больше не существует. это два возможных её логических конца. чем бы и где бы эти действия не вызваны.
за SDAC не скажу, но IBX номер текущей транзакции возвращает здесь: TIBTransaction.TransactionID
29 май 18, 17:08    [21451188]     Ответить | Цитировать Сообщить модератору
 Re: SDAC Сброс транзакции  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1105
После ошибки SQL Server откатывает транзакцию, при следующем выполнении запроса MS Native Client стартует новую транзакцию.
Данное поведение не зависит от SDAC, к сожалению, мы не можем повлиять на это.
12 июн 18, 16:09    [21486253]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить