Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Информация по транзакции / 25 сообщений из 29, страница 1 из 2
22.09.2021, 13:13
    #40099257
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Всем привет

Пытаюсь поймать, какая транзакция в приложении не коммитится.
Настроил и запустил трейс, конфигурация такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
database = %db_mbfru.ib
{
    enabled = true
    log_statement_start = false
    log_statement_finish = true
    log_initfini = false
    print_perf = true
    log_context = true
    log_transactions = true
}

Вижу в БД не коммитится транзакция: 6389531
В логе, по ней видно только это:
Код: plaintext
1.
2.
3.
4.
2021-09-22T12:39:53.5650 (7588:000000003B464FC0) START_TRANSACTION
	E:\IB_BASE\DB_MBFRU.IB (ATT_319201, SYSDBA:NONE, UTF8, TCPv4:10.10.44.108/49394)
	C:\FinStart-RU\FinStart.exe:7152
		(TRA_6389531, READ_COMMITTED | REC_VERSION | NOWAIT | READ_WRITE)
Никаких стейтментов нет, в то же время смущает, что результат запроса, дает ненулевое значение в mon$record_idx_reads, в данном случае 992. Запрос такой:
Код: plsql
1.
2.
3.
select mon$record_idx_reads 
from mon$transactions tr left join mon$record_stats r on tr.mon$stat_id = r.mon$stat_id
where mon$transaction_id =6389531



Хочется понять, что же выполнялось в транзакции, чтобы как-то ее идентифицировать? Может еще есть какие-то настройки трейса, которые могут показать, кто и какой индекс/таблицу вычитывал?
...
Рейтинг: 0 / 0
22.09.2021, 13:23
    #40099262
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Нашел:
log_statement_start = true сделал и все увидел. Ступил, что стейтмент может стартовать но не финишировать.
...
Рейтинг: 0 / 0
22.09.2021, 15:10
    #40099322
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
AtanasПытаюсь поймать, какая транзакция в приложении не коммитится.
а зачем тут трейс? Всё что не-коммиттед есть в mon$transactions. и там (в mon) видно и что за запросы выполняются в ней, и в каком они состоянии, и из какого приложения.
Так что, можно было и без трейса.
И record_stats тут нафиг не нужен. mon$transactions join mon$statements join mon$attachments.
...
Рейтинг: 0 / 0
23.09.2021, 15:00
    #40099530
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv
AtanasПытаюсь поймать, какая транзакция в приложении не коммитится.

а зачем тут трейс? Всё что не-коммиттед есть в mon$transactions. и там (в mon) видно и что за запросы выполняются в ней, и в каком они состоянии, и из какого приложения.
Так что, можно было и без трейса.
И record_stats тут нафиг не нужен. mon$transactions join mon$statements join mon$attachments.

Да ничего в mon$transactions как раз и не видно, поэтому и взялся за трейс. Через mon$record_stats я убеждался что транзакция не просто стартанула и висит, а что-то в ней выполнилось. Приложение из mon$attachments получить не проблема, но я его и так знаю.
По поводу все видно не согласен, в mon$statements есть открытые запросы, незакоммиченные, но вот только mon$transaction_id у всех NULL. Как без трейса определить какой из них в рамках нужной транзакции открыт?
...
Рейтинг: 0 / 0
23.09.2021, 15:11
    #40099536
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
AtanasДа ничего в mon$transactions как раз и не видно
вы ищете активную транзакцию. активные - в mon$transactions.
Если ищете транзакцию, которая "долго жила, но уже кончилась" - тогда да, только трейс поможет.
Но в трейсе придется долго колупаться, если такая транзакция уже кончилась и в mon$ ее нет.
Atanas только mon$transaction_id у всех NULL.
да потому что это prepared-запросы, которые не выполняются в данный момент.
AtanasКак без трейса определить какой из них в рамках нужной транзакции открыт?
transaction_id будет не null (и не 0).
...
Рейтинг: 0 / 0
23.09.2021, 15:20
    #40099539
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv,

ИХМО, в mon$statements можно было бы ввести ещё одно поле, номер транзакции в которой был препарирован запрос.
...
Рейтинг: 0 / 0
23.09.2021, 15:22
    #40099540
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денис,

а зачем? он препарируется вроде как не в транзакции (тут я не в курсе деталей). Где ему prepare сделан - вообще пофиг, он к аттачменту привязан, и это хорошо. А выполнить его можно в любой транзакции, и тогда он уже будет "привязан" к конкретной транзакции.
Да, и если запрос уже выполнялся в какой-то транзакции, но уже закрыт, но еще prepared - тоже до лампочки. mon$ это текущий снимок, и в момент снимка состояние вот такое, и никакое другое. А что там было раньше-позже и уже кончилось, mon$ не показывает.
...
Рейтинг: 0 / 0
23.09.2021, 15:27
    #40099542
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денис
ИХМО, в mon$statements можно было бы ввести ещё одно поле, номер транзакции в которой был препарирован запрос.
А смысл ?
...
Рейтинг: 0 / 0
23.09.2021, 15:42
    #40099549
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv,

prepare в транзакции выполняется судя по API. Как минимум транзакция туда передаётся.
Может ли помочь информация в какой транзакции препарирован запрос хз.
Если препарирование и выполнение в одной транзакции происходит, то наверное да.
В остальных случаях информация скорее всего несёт мало смысла.
...
Рейтинг: 0 / 0
23.09.2021, 16:00
    #40099557
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денисprepare в транзакции выполняется судя по API.
по идее, запросы обычно препарируются и выполняются в одной транзакции.
И как я понимаю, поэтому isc_dsql_prepare имеет параметром isc_tr_handle*, без аттачмента (из транзакции аттачмент как раз понятен).
Но дальше выполнять prepared statement в этой же транзакции никто не запрещает. Однако, почему ид. транзакции после prepare равен null - честно говоря, х.з.
С другой стороны, именно так в mon$ можно отличить выполняемые запросы от просто препарированных.
В другом варианте можно было бы у mon$statememts.mon$state добавить в MON$STATE состояние prepared.
Почему сделано вот так, а не через mon$state - понятия не имею. Так внутри движка?

Кроме того, вот это вот idle и active меня вводят в ступор
Код: plaintext
1.
2.
      - MON$STATE (statement state)
          0: idle
          1: active
ну допустим active это пока запрос или сортирует, или едет по индексу, или еще что.
А вот idle - это в состоянии fetch? Зачем тогда написано idle?
Унификация с attachments и transactions? Непонятнооо...
...
Рейтинг: 0 / 0
23.09.2021, 16:05
    #40099560
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdvиз транзакции аттачмент как раз понятен

Как раз таки нет, их там может быть несколько.

Препарирующей транзакцией определяется состояние метаданных, доступное данному
запросу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2021, 16:10
    #40099563
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv,

нет я не за то чтобы препарирующую транзакцию записывать в transaction_id.
Пусть там будет как раз идентификатор транзакции в который выполняется запрос ибо выполняться он может восе не обязательно в той же транзакции в которой препарировался. Я за то, чтобы ввести ещё один столбец prepared_transaction_id
...
Рейтинг: 0 / 0
23.09.2021, 16:15
    #40099568
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денис,

а я за то, чтобы фиксировать transaction_id при prepare, а не делать его null. а в mon$statements.mon$state добавить состояние prepared.
imho так более логично, чем добавлять какой-то непонятный столбец в тот же mon$statements.
...
Рейтинг: 0 / 0
23.09.2021, 16:30
    #40099572
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv
Однако, почему ид. транзакции после prepare равен null - честно говоря, х.з.
Потому что запрос НЕ выполняется и НЕ связан с какой-либо тр-цией.

kdv
С другой стороны, именно так в mon$ можно отличить выполняемые запросы от просто препарированных.
Точно.

kdv
В другом варианте можно было бы у mon$statememts.mon$state добавить в MON$STATE состояние prepared.
Не prepared там нет и быть не может :)

kdv
А вот idle - это в состоянии fetch?
Уже много раз объясняли, idle это состояние между фетчами, или между open и fetch.
Т.е. выполнение запроса приостановлено.
...
Рейтинг: 0 / 0
23.09.2021, 16:31
    #40099573
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Dimitry Sibiryakov
kdvиз транзакции аттачмент как раз понятен

Как раз таки нет, их там может быть несколько.Не может. 2PC тр-ции тут не в кассу, если ты об этом.
...
Рейтинг: 0 / 0
23.09.2021, 16:31
    #40099574
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Попытка ответа самому себе считается ? :)
...
Рейтинг: 0 / 0
23.09.2021, 16:34
    #40099577
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денис
Я за то, чтобы ввести ещё один столбец prepared_transaction_id
Вопрос о смысле тот же.
...
Рейтинг: 0 / 0
23.09.2021, 16:36
    #40099579
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
hvlad
Уже много раз объясняли, idle это состояние между фетчами, или между open и fetch.
Т.е. выполнение запроса приостановлено.

это stalled ;-) А idle - это запрос препарирован, но не выполняется. Либо еще, либо уже (выполнился, курсор закрыт, но запрос не освобожден).
...
Рейтинг: 0 / 0
23.09.2021, 16:36
    #40099580
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
kdv
AtanasДа ничего в mon$transactions как раз и не видно

вы ищете активную транзакцию. активные - в mon$transactions.
Если ищете транзакцию, которая "долго жила, но уже кончилась" - тогда да, только трейс поможет.
Но в трейсе придется долго колупаться, если такая транзакция уже кончилась и в mon$ ее нет.
Atanas только mon$transaction_id у всех NULL.
да потому что это prepared-запросы, которые не выполняются в данный момент.
AtanasКак без трейса определить какой из них в рамках нужной транзакции открыт?
transaction_id будет не null (и не 0).

Я про это пишу, транзакция активная. Запрос в ней открыт, но в mon$statements у него mon$transaction_id = null, что не позволяет мне определить, какой запрос выполнился/выполнялся в текущей активной транзакции.

Пример из IBExpert:
В первом окне SQL-редактора открываю запрос:
Код: plaintext
1.
select current_connection from rdb$database
который возвращает мне 4584
Открываю новое окно и запускаю такой запрос:
Код: plaintext
1.
select * from mon$statements where mon$attachment_id = 4584
Возвращается, см приложенную картинку.

Т.е. видно, что для активной транзакции с помощью mon-таблиц нет возможности найти выполнившийся в рамках нее запрос/запросы, хоть запросы еще не закрыты. Заполненый mon$transaction_id имеют только запросы выполняющиеся (фетчащиеся) в текущий момент.
...
Рейтинг: 0 / 0
23.09.2021, 16:38
    #40099581
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Симонов Денис
ввести ещё один столбец prepared_transaction_id

мониторинг - это слепок текущего состояния. Он не может ссылаться на потенциально несуществующую (уже завершенную, например) транзакцию.
...
Рейтинг: 0 / 0
23.09.2021, 16:41
    #40099582
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Atanas
с помощью mon-таблиц нет возможности найти выполнившийся в рамках нее запрос/запросы

ибо это история, к таблицам мониторинга она не имеет отношения. Также там нет возможности увидеть закоммиченные в прошлом транзакции и отключенных недавно юзеров :-) Инструмент выбран неверно, для истории есть трассировка/аудит.
...
Рейтинг: 0 / 0
23.09.2021, 16:44
    #40099583
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
dimitr
Atanas
с помощью mon-таблиц нет возможности найти выполнившийся в рамках нее запрос/запросы

ибо это история, к таблицам мониторинга она не имеет отношения. Также там нет возможности увидеть закоммиченные в прощлом транзакции и отключенных юзеров :-) Инструмент выбран неверно, для истории есть трассировка/аудит.


Я отвечал на вопрос kdv, почему связался с трейсом
...
Рейтинг: 0 / 0
23.09.2021, 16:50
    #40099585
Atanas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
hvlad
Симонов Денис
Я за то, чтобы ввести ещё один столбец prepared_transaction_id
Вопрос о смысле тот же.


А почему нельзя пока выборка/крурсор не закрыт оставлять заполненным mon$transaction_id?
...
Рейтинг: 0 / 0
23.09.2021, 17:01
    #40099587
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
Atanas
А почему нельзя пока выборка/крурсор не закрыт оставлять заполненным mon$transaction_id?

в принципе, можно. Сейчас просто в движке снимается флаг активности запроса сразу после чтения последней записи и это отражается в мониторинге. Даже если клиент еще не закрыл курсор. Наверное можно выводить ID транзакции всегда, пока курсор к ней привязан (т.е. по сути пока не закрыт), ибо тр-цию с активными курсорами все равно нельзя завершить и ссылка будет легальна.
...
Рейтинг: 0 / 0
23.09.2021, 17:02
    #40099588
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Информация по транзакции
dimitr
это stalled ;-)
Ну, оно же когда-то показывалось как idle ?
По крайней мере тут 22375038 два состояния :)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Информация по транзакции / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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