Isc_database_info. Информация о транзакциях.

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 03 сен 2012, 22:54

Добрый вечер.
В своем приложении появилась необходимость отображения информации о транзакциях. Написав код, оказалось, что информация о NextTransaction не соответствует действительности (равна OldestActive/OldestSnapshot). Разработчики компонент доступа на своем форуме написали, что компоненты использует isc_database_info API функцию для получения статистики базы данных, которая возвращает некорректные данные об идентификаторах транзакций.
Версия сервера WI-V2.5.1.26351.
Кто сталкивался?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 04 сен 2012, 10:16

код IBX смотрели? какая версия Delphi ? насколько я в курсе, IBX в этом плане корректно работает, по крайней мере в 2006 и 2007. Вряд-ли IBDatabaseInfo менялся с тех пор.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 04 сен 2012, 13:07

Код IBX не смотрел. Они у меня не установлены. Использую компоненты доступа Devart IBDac.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Isc_database_info. Информация о транзакциях.

Сообщение hvlad » 04 сен 2012, 13:15

SyntaXErr0r писал(а):Разработчики компонент доступа на своем форуме написали, что компоненты использует isc_database_info API функцию для получения статистики базы данных, которая возвращает некорректные данные об идентификаторах транзакций.
Где этот форум ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 04 сен 2012, 15:09

Использую компоненты доступа Devart IBDac.
интересное кино. Тогда в студию:
- что выдает IBX - TIBDatabaseInfo
- что выдает IBDac
- что выдает gstat -h

кстати, на официальном (анг) форуме IBDac (devart) я никаких сообщений на эту тему не нахожу.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 04 сен 2012, 17:52

Извиняюсь за долгий ответ, не был на месте.
- что выдает IBX - TIBDatabaseInfo
IBX, к сожалению, у меня нет, проверить не могу.
- что выдает IBDac
В IBDac значение совпадает с OldestActive (и OldestSnapshot).
- что выдает gstat -h
gstat -h - см. ниже.
kdv писал(а):кстати, на официальном (анг) форуме IBDac (devart) я никаких сообщений на эту тему не нахожу
hvlad писал(а):Где этот форум ?
Форум (тема) здесь. У них два форума официальных - английский и русский.

Кстати, запустил трэйс. Пишет, что:

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

2012-09-04T16:43:21.7340 (1728:01BAC484) START_TRANSACTION
    Base.FDB (ATT_4219, SYSDBA:NONE, WIN1251, XNET:DELL)
    C:\Program Files\HK-Software\IBExpert\ibexpert.exe:2908
        (TRA_29024451, READ_COMMITTED | REC_VERSION | NOWAIT | READ_WRITE)

2012-09-04T16:43:21.7340 (1728:01BAC484) COMMIT_TRANSACTION
    Base.FDB (ATT_4219, SYSDBA:NONE, WIN1251, XNET:DELL)
    C:\Program Files\HK-Software\IBExpert\ibexpert.exe:2908
        (TRA_29024451, READ_COMMITTED | REC_VERSION | NOWAIT | READ_WRITE)
      0 ms, 1 write(s), 1 fetch(es), 1 mark(s)
Т.е. транзакция 29024451 уже подтверждена. Открываю консоль. Запускаю gstat:

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

Database "Base.FDB"
Database header page information:
        Flags                   0
        Checksum                12345
        Generation              29024653
        Page size               8192
        ODS version             11.2
        Oldest transaction      28966734
        Oldest active           29024450
        Oldest snapshot         29024450
        Next transaction        29024451
        Bumped transaction      1
        Sequence number         0
        Next attachment ID      4229
        Implementation ID       16
        Shadow count            0
        Page buffers            16384
        Next header page        0
        Database dialect        3
        Creation date           Oct 18, 2011 11:20:35
        Attributes              force write

    Variable header data:
        Sweep interval:         0
        *END*
Т.е Next transaction 29024451.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Isc_database_info. Информация о транзакциях.

Сообщение hvlad » 04 сен 2012, 20:03

SyntaXErr0r писал(а):
hvlad писал(а):Где этот форум ?
Форум (тема) здесь.
Регистрироваться там я не буду, так что пусть или сами приходят сюда (или в трекер, если уверены) со своим кодом, или ищут у себя таракана без нашей помощи.

Для проверки можно взять isql в котором show database использует ту же isc_database_info.
SyntaXErr0r писал(а):Кстати, запустил трэйс. Пишет, что:
...
Т.е. транзакция 29024451 уже подтверждена. Открываю консоль. Запускаю gstat:
...
Т.е Next transaction 29024451.
Это правильно.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 04 сен 2012, 21:22

hvlad писал(а):Это правильно.
:?: Почему так? Она же уже как бы всё...
Последний раз редактировалось SyntaXErr0r 04 сен 2012, 21:32, всего редактировалось 2 раза.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 04 сен 2012, 21:28

IBX, к сожалению, у меня нет, проверить не могу.
нет - это как, вы его УДАЛИЛИ? IBX по умолчанию во все Дельфи входит, это закладка InterBase в палитре компонент.
Впрочем, IBX можете не проверять, что-то я там не нашел получения номеров транзакций... :shock:

В любом случае, если бы isc_database_info так работал, то одна из моих программ работала бы некорректно. А этого нет. И она работает одним кодом со всеми версиями InterBase и Firebird. Значит проблема все же в IBDac.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 04 сен 2012, 21:30

Почему так? Она же уже как бы всё...
х.з., почему у вас так. Next transaction всегда имеет номер как минимум +1 к Oldest Active, и уж точно НИКОГДА не равна Oldest Active или чему то еще. Потому что это номер, который будет выдан следующей новой транзакции.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 04 сен 2012, 21:31

kdv писал(а):
IBX, к сожалению, у меня нет, проверить не могу.
нет - это как, вы его УДАЛИЛИ? IBX по умолчанию во все Дельфи входит, это закладка InterBase в палитре компонент.
Впрочем, IBX можете не проверять, что-то я там не нашел получения номеров транзакций... :shock:

В любом случае, если бы isc_database_info так работал, то одна из моих программ работала бы некорректно. А этого нет. И она работает одним кодом со всеми версиями InterBase и Firebird. Значит проблема все же в IBDac.
Нет. Я при установке их не отмечал для установки. У знакомого программиста смотрел код IBX. Не нашел. Вы правильно написали. Разработчиков пригласил сюда.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Isc_database_info. Информация о транзакциях.

Сообщение hvlad » 04 сен 2012, 21:42

SyntaXErr0r писал(а):
hvlad писал(а):Это правильно.
:?: Почему так?
Пишите письма Джиму.

Так было всегда.
Неверующие сами изучают TRA_start и bump_transaction_id.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 04 сен 2012, 21:44

hvlad писал(а):Пишите письма Джиму.
Адрес подскажите. Я его своим "спамом" замучаю.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 05 сен 2012, 01:29

Адрес подскажите. Я его своим "спамом" замучаю.
мне кажется что любой, кто работает с Firebird или InterBase, должен знать автора InterBase - Джима Старки.
http://en.wikipedia.org/wiki/Jim_Starkey
И, писать ему письма бесполезно, он уже давно не занимается IB, а ФБ не занимался тем более.
Я при установке их не отмечал для установки.
не припомню, чтобы IBX можно было НЕ устанавливать. Впрочем, для данного вопроса это не важно.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 05 сен 2012, 02:01

Я сразу понял о ком идет речь. Юмор не поняли. Читал о нем еще за до того, как начал работать с IB\FB.
не припомню, чтобы IBX можно было НЕ устанавливать. Впрочем, для данного вопроса это не важно.
При установке среды отменил установку в выпадающем списке инсталлятора.

Изображение

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 05 сен 2012, 02:05

Всем спасибо за потраченное время на ответы.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 05 сен 2012, 10:23

Юмор не поняли.
получается, да. Увы.
Всем спасибо за потраченное время на ответы.
проблема решилась? каким образом?

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 05 сен 2012, 12:14

проблема решилась? каким образом?
К сожалению пока нет. Временно отложил.

SyntaXErr0r
Сообщения: 10
Зарегистрирован: 03 сен 2012, 22:36

Re: Isc_database_info. Информация о транзакциях.

Сообщение SyntaXErr0r » 06 сен 2012, 17:33

Хм. Это правда, что утилита gstat читает идентификаторы транзакций напрямую из файла базы данных без подключения к ней? Публикую ответы разработчиков IBDac (с ихнего разрешения):
---
Мы более глубоко исследовали данную проблему. IBDAC при соединении с базой получает ее данные, при этом стартуется и завершается транзакция. Если хотя бы одна транзакции была начата в текущей сессии, вызов isc_database_info в этой сессии возвращает в Oldest Transaction идентификатор этой транзакции, а Oldest Active, Snapshot и Next Transaction - идентификатор этой транзакции плюс один. Это поведение Firebird, мы не можем повлиять него.
---
Могу добавить что я также проверил несколько сторонних компонент и все ведут себя одинаково. До использования транзакций в сессии идентификаторы получаются корректные, после - некорректные (вполне возможно что это корректное поведение Firebird).
И еще, утилита gstat читает идентификаторы транзакций напрямую из файла базы данных без подключения к ней (в отличии от других компонент и утилит для работы с Firebird).

---
Вот такие пироги...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Isc_database_info. Информация о транзакциях.

Сообщение kdv » 06 сен 2012, 21:23

Это правда, что утилита gstat читает идентификаторы транзакций напрямую из файла базы данных без подключения к ней?
да, если указано только gstat -h. И это делает ТОЛЬКО gstat.
вызов isc_database_info в этой сессии возвращает в Oldest Transaction идентификатор этой транзакции, а Oldest Active, Snapshot и Next Transaction - идентификатор этой транзакции плюс один. Это поведение Firebird, мы не можем повлиять него.
у нас есть утилита IBTM. Писал ее я. Утилита мониторит состояние транзакций в указанной БД - раз в минуту или другой интервал обращается к базе, получает состояние транзакций, и отсоединяется от БД. Информация сохраняется в файл логов.
Получение состояния транзакций в IBTM производится тремя способами
- стандартный, работает со всеми версиями InterBase и Firebird, через isc_database_info
- через services api, текст как gstat -h парсится
- через tmp$transactions для InterBase 7.x и выше.
Всего файлов статистики (таких логов) накоплено с не менее 100 разных серверов. В основном статистика собиралась стандартным методом, через isc_database_info.

Вот пример, когда нет активных транзакций
9:47:00 PM,61651194,61651195,61651195,61651196
9:48:00 PM,61651455,61651456,61651456,61651457
9:49:00 PM,61651620,61651621,61651621,61651622

OIT, OST, OAT, Next.
Как видите, Next здесь +1.

Вопрос - что я делаю неправильно? :)
Возможно то, что в этом же коннекте я не стартую никаких других транзакций. Но это я могу проверить. И также это можете проверить вы (быстрее, чем я). Или в IBDac всегда активна хоть одна транзакция?
IBDAC при соединении с базой получает ее данные, при этом стартуется и завершается транзакция.
для вызова isc_database_info стартовать транзакцию не нужно.

Ответить