powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SDAC Сброс транзакции
20 сообщений из 20, страница 1 из 1
SDAC Сброс транзакции
    #39649895
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую SDAC 7.3.12.
При возникновении ошибки меняется номер транзакции. Это приводит к тому, что данные из предыдущей транзакции исчезают.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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), которую я стартовал.

...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39649899
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то картинка не вставилась.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39649903
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автокоммит?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39649935
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

У соединения AutoCommit выключен.
Из опций у con: TMSConnection KeepDesignConnected = false. Всё остальное - по умолчанию.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39649939
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут скорее такое поведение: при ошибке происходит роллбак всей транзакции, но т.к. дальше идут операции то стартует новая транзакция.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39650171
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xact_abort?
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39650173
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и не грех проверять InTransaction при коммитах и роллбэках
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39650176
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и как финал, что мешает в msqry2 выполнить и хранимку и сразу вернуть резалтсет? тогда у вас будет нормальный контроль транзакции внутри хранимки
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39650203
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди, приведённый пример -- тестовый. На самом деле очень много действий выполняется в рамках одной транзакции. И работа ориентирована на некий флаг - существование записи в определенной таблице.

А флаг InTransaction я проверю после ошибки. и xact_abort тоже.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39650320
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше чтобы транзакция не выполнялась долго, в ее контексте и блокировки и бог его знает что еще происходит. как вариант выполнять запрос не через коннекшн, а через запрос, там тогда можно нормально обработать ошибку и вернуть ее через return, а не райзеррор на клиента как фактически скорее всего срабатывает тут. Попробуйте.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651000
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Флаг InTransaction у соединения после ошибки - true. Т.е. ориентироваться на этот флаг нельзя. xact_abort тоже не устраивает.

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

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

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

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

Возможно, это фича SDAC. Тогда возможно есть какой-то флаг у соединения, который изменяет такое поведение (старт новой транзакции, если предыдущий запрос завершился по ошибке райзеррор).
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651339
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй выполнять

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



не через TMSConnection, а через TMSQuery
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651507
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди, если использовать TMSQuery, а не TMSConnection, то ситуация не меняется, т.к. ошибка в скрипте вызывает raiseerror. И следующий запрос к базе также начинает новую транзакцию.
Код: pascal
1.
2.
  msqry1.SQL.Text := 'use [qweqasdasd]';
  msqry1.Execute; // Ошибка



Буду ждать devart. Может быть он прояснит ситуацию.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651538
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то мне подсказывает что возможно транзакцию откатывает прямо на сервере столкнувшись с raiseerror.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651552
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндичто-то мне подсказывает что возможно транзакцию откатывает прямо на сервере столкнувшись с raiseerror.
То, что транзакция откатывается, это нормально. Странно то, что следующим запросом новая транзакция начинается. И номер у неё новый.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651696
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

так если старая откачена - то как бы всё. её больше нет. она закончилась откатом. ну и, соответственно, при новом запросе новая поднимается.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651729
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
махаон скорее всего имеет ввиду что не бывает запросов вне контекста транзакции и если старая у тебя завершилась при Raiseerror то новая просто автоматически будет запущена в момент выполнения следующего запроса.
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651773
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм. Тогда как определить, что началась новая транзакция? Анализировать Exception? Или же есть явный признак?
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39651953
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имею в виду, что после коммита или роллбэка транзакция больше не существует. это два возможных её логических конца. чем бы и где бы эти действия не вызваны.
за SDAC не скажу, но IBX номер текущей транзакции возвращает здесь: TIBTransaction.TransactionID
...
Рейтинг: 0 / 0
SDAC Сброс транзакции
    #39659767
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После ошибки SQL Server откатывает транзакцию, при следующем выполнении запроса MS Native Client стартует новую транзакцию.
Данное поведение не зависит от SDAC, к сожалению, мы не можем повлиять на это.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SDAC Сброс транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]