powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / invalid transaction handle
11 сообщений из 11, страница 1 из 1
invalid transaction handle
    #40039015
Добрый день

Ситуация следующая.
Приложение работает в связке Delphi+vbs+Firebird.

Клиент: Windows 10 Pro, Firebird 2.5.9
Сервер: Windows Server 2008 R2 Standart, Firebird 2.5.8

На клиенте выполняется следующий код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  Dim qSetContext
  Set qSetContext = Creator.GetObject(Null, "TIBSQL", "")
  qSetContext.Transaction = RemoteTransaction
  qSetContext.SQL.Text = _
    "SELECT RDB$SET_CONTEXT('USER_TRANSACTION', 'SYNCHRTYPE', 1) " & vbCrLf & _
    "FROM RDB$DATABASE "
  qSetContext.ExecQuery

  ...
  RemoteTransaction.Commit
  RemoteTransaction.StartTransaction

  qSetContext.Close
  qSetContext.ExecQuery

  qChange.Transaction = RemoteTransaction '''транзакция баз на сервере
  qChange.Close
  qChange.ParamByName("DB").AsString = DBName  ''' Путь к клиентской(текущей) БД
  qChange.ExecQuery




Запрос для qChange:
Код: sql
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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
EXECUTE BLOCK(
  DB VARCHAR(255) = :DB)
AS
DECLARE VARIABLE ERRNO INTEGER;
DECLARE VARIABLE ERRDESCRIPTION VARCHAR(1024);
DECLARE VARIABLE OperationType SMALLINT;
DECLARE VARIABLE LOGID INTEGER;
DECLARE VARIABLE ID TYPE OF COLUMN GD_PLACE.ID;
DECLARE VARIABLE ID_XID INTEGER;
DECLARE VARIABLE ID_DBID INTEGER;
DECLARE VARIABLE PARENT TYPE OF COLUMN GD_PLACE.PARENT;
DECLARE VARIABLE PARENT_XID INTEGER;
DECLARE VARIABLE PARENT_DBID INTEGER;
DECLARE VARIABLE NAME TYPE OF COLUMN GD_PLACE.NAME;
DECLARE VARIABLE PLACETYPE TYPE OF COLUMN GD_PLACE.PLACETYPE;
BEGIN
  FOR
  EXECUTE STATEMENT
    ('SELECT  l.ID, l.USR$OPERATIONTYPE, ID_RUID.XID AS ID_XID, ID_RUID.DBID AS ID_DBID , PARENT_RUID.XID AS PARENT_XID, PARENT_RUID.DBID AS PARENT_DBID, z.NAME, z.PLACETYPE
     FROM
       USR$MN_LOGSYNCHR l
       JOIN USR$TABLES_FOR_SYNCHRONIZATION tfs ON tfs.USR$RANK = l.USR$OBJECTTYPE
       JOIN USR$MN_FRONT f ON f.ID = l.USR$FRONTKEY
       LEFT JOIN GD_P_GETRUID(l.USR$OBJECTKEY) ID_RUID ON 1 = 1
       LEFT JOIN GD_PLACE z ON l.USR$OBJECTKEY = z.ID
       LEFT JOIN GD_P_GETRUID(z.PARENT) PARENT_RUID ON 1 = 1
     WHERE
       l.USR$OBJECTTYPE = 1 AND l.USR$OPERATIONTYPE IN (0,1,2,3)
        AND COALESCE(tfs.USR$ISSYNCHR, 0) = 1  AND  COALESCE(l.USR$MN_SYNCHRTYPE, 0) = 1  AND  (UPPER(f.USR$NAME) = UPPER(:FRONT_NAME))
     ORDER BY l.USR$OBJECTTYPE, l.USR$NUMBER')
(FRONT_NAME := 'front_ABK')
  ON EXTERNAL :DB
  AS USER 'SYSDBA' PASSWORD 'masterke'
  WITH COMMON TRANSACTION
  INTO  :LOGID, :OperationType, :ID_XID, :ID_DBID , :PARENT_XID, :PARENT_DBID, :NAME, :PLACETYPE
  DO
  BEGIN WHILE (1=1) DO BEGIN
    ID = NULL;
    ERRNO = NULL;

    IF (ID_XID < 147000000 AND ID_DBID = 17) THEN
      EXECUTE PROCEDURE USR$GD_P_GETID_NULL(:ID_XID, :ID_DBID) RETURNING_VALUES :ID;
    ELSE
      SELECT
        z.ID
      FROM GD_PLACE z
      JOIN GD_RUID r ON r.ID = z.ID
      WHERE
        r.XID = :ID_XID AND r.DBID = :ID_DBID
      INTO :ID;

    IF (OperationType = 3) THEN
    BEGIN
      DELETE FROM GD_PLACE WHERE ID = :ID;
      LEAVE;
    END

    EXECUTE PROCEDURE USR$GD_P_GETID_NULL(:PARENT_XID, :PARENT_DBID) RETURNING_VALUES :PARENT;
     IF (ID IS NULL) THEN
    BEGIN
       ID = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0);

      INSERT INTO GD_PLACE(ID, PARENT, NAME, PLACETYPE)
      VALUES(:ID, :PARENT, :NAME, :PLACETYPE);

      EXECUTE PROCEDURE USR$SYNCHR_RUID(:ID, :ID_XID, :ID_DBID);
    END
    ELSE
      UPDATE GD_PLACE
      SET PARENT = :PARENT, NAME = :NAME, PLACETYPE = :PLACETYPE
      WHERE ID = :ID;
    LEAVE;

    /*&#206;&#225;&#240;&#224;&#225;&#238;&#242;&#247;&#232;&#234; &#232;&#241;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#233;*/
    WHEN ANY DO
    BEGIN
      ERRNO = sqlcode;
      ERRDESCRIPTION = '&#207;&#240;&#238;&#232;&#231;&#238;&#248;&#235;&#224; &#238;&#248;&#232;&#225;&#234;&#224;. &#202;&#238;&#228;: ' || ERRNO;
      LEAVE;
    END
  END
  IF (ERRNO IS NOT NULL) THEN
    EXECUTE STATEMENT
      'UPDATE USR$MN_LOGSYNCHR SET USR$ERRORDESCRIPTION = ''' || ERRDESCRIPTION || ''' WHERE ID = ' || LOGID
    ON EXTERNAL :DB
    AS USER 'SYSDBA' PASSWORD 'masterke'
    WITH COMMON TRANSACTION;
  ELSE
    EXECUTE STATEMENT
      'EXECUTE BLOCK
       AS
       BEGIN

         DELETE FROM USR$MN_LOGSYNCHR l WHERE l.ID = ' || LOGID || ';
       END'
    ON EXTERNAL :DB
    AS USER 'SYSDBA' PASSWORD 'masterke'
    WITH COMMON TRANSACTION;
  END
END




Выполняется скрипт при открытии одного окна пользователем. Иногда вываливается ошибка Invalid transaction handle (expecting explicit transaction start) на строке
Код: vbnet
1.
qChange.ParamByName("DB").AsString = DBName




Подкиньте, пожалуйста, идей для решения проблемы.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039020
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любительПодкиньте, пожалуйста, идей для решения проблемы.

Пересадка рук программиста с задницы поближе к мозгу должна помочь. В приведённом коде
последовательность вызовов просто эпична и напоминает объявление "закрывайте двери перед
собой".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039033
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любитель,

это ж клиентская ошибка. Раз там явное управление и автостарта нет, значит где-то явно транзакцию не стартуете (в приложении).
И Execute block тут ни при чем.
хирург-любительна строке
ну вот перед строкой и надо проверить, активна RemoteTransaction или нет.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039182
kdv,

Ну транзакция явно стартуется в коде выше.

А поскольку на присвоении параметра запроса кидает, а не на выполнении, то, как я понимаю, это означает, что на компиляции именно execute block что-то происходит.

Если бы проблема в транзакции на клиенте была, то по идее должно было ругаться на выполнении запроса в qChange.ExecQuery.

Не может ли это быть связано с разницей в версия FB ?
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039183
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любительНу транзакция явно стартуется в коде выше.

В таком грязном коде может затеряться и её неявное окончание.

хирург-любительНе может ли это быть связано с разницей в версия FB ?

Нет. Единственная возможная причина этой ошибки - нулевой (или мусорный) isc_tr_handle при
вызове функции API.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039194
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любительНу транзакция явно стартуется в коде выше.
ну, там коммит без старта, потом старт без последующего коммита...
В общем, DS ответил, плюсую.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039254
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любитель
Добрый день

Ситуация следующая.
Приложение работает в связке Delphi+vbs+Firebird.

...

Выполняется скрипт при открытии одного окна пользователем. Иногда вываливается ошибка Invalid transaction handle (expecting explicit transaction start)
на строке
Код: vbnet
1.
qChange.ParamByName("DB").AsString = DBName



Подкиньте, пожалуйста, идей для решения проблемы.

Там у пользователя не вылазит по тайм-ауту окно с предложением завершить скрипт, которое он закрывает по OK не глядя?

На сколько я помню, у ScriptControl-а были свойства для задания таймаута и запрещения подобного UI.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039275
kdv,

Мне казалось, что я вполне явно указал выборочность указанного куска кода, чтобы опустить ненужные детали.

Естественно, транзакция явно стартуется в коде, иначе бы всё это просто не работало.
Проблема возникает на одном конкретном клиенте.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039277
Коваленко Дмитрий,

По тайм-ауту? Нет, такого нет.
Вываливается только в конкретно этот момент конкретно этот эксепшн.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039278
хирург-любитель
kdv,

Мне казалось, что я вполне явно указал выборочность указанного куска кода, чтобы опустить ненужные детали.

Естественно, транзакция явно стартуется и завершается в коде, иначе бы всё это просто не работало.
Проблема возникает на одном конкретном клиенте.
...
Рейтинг: 0 / 0
invalid transaction handle
    #40039301
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хирург-любитель,

курсоры надо закрывать до commit, а не после него.

Устанавливать контекстные переменные через

Код: sql
1.
SELECT RDB$SET_CONTEXT('USER_TRANSACTION', 'SYNCHRTYPE', 1) FROM RDB$DATABASE



не самая хорошая идея. SELECT это курсор, значит из него надо как минимум фетчить одну запись, которая вам по сути не нужна.

Не знаю как оно там через vbs работает, но обычно запросы с параметрами обычно сначала препарируют
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / invalid transaction handle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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