Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SDAC Сброс транзакции / 20 сообщений из 20, страница 1 из 1
25.05.2018, 13:49
    #39649895
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SDAC Сброс транзакции
Использую 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
25.05.2018, 13:52
    #39649899
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SDAC Сброс транзакции
Что-то картинка не вставилась.
...
Рейтинг: 0 / 0
25.05.2018, 13:53
    #39649903
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SDAC Сброс транзакции
Автокоммит?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.05.2018, 14:29
    #39649935
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SDAC Сброс транзакции
Dimitry Sibiryakov,

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

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

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

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

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

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

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

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



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



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

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


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