powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Информация по транзакции
25 сообщений из 29, страница 1 из 2
Информация по транзакции
    #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
Информация по транзакции
    #40099262
Atanas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел:
log_statement_start = true сделал и все увидел. Ступил, что стейтмент может стартовать но не финишировать.
...
Рейтинг: 0 / 0
Информация по транзакции
    #40099322
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AtanasПытаюсь поймать, какая транзакция в приложении не коммитится.
а зачем тут трейс? Всё что не-коммиттед есть в mon$transactions. и там (в mon) видно и что за запросы выполняются в ней, и в каком они состоянии, и из какого приложения.
Так что, можно было и без трейса.
И record_stats тут нафиг не нужен. mon$transactions join mon$statements join mon$attachments.
...
Рейтинг: 0 / 0
Информация по транзакции
    #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
Информация по транзакции
    #40099536
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AtanasДа ничего в mon$transactions как раз и не видно
вы ищете активную транзакцию. активные - в mon$transactions.
Если ищете транзакцию, которая "долго жила, но уже кончилась" - тогда да, только трейс поможет.
Но в трейсе придется долго колупаться, если такая транзакция уже кончилась и в mon$ ее нет.
Atanas только mon$transaction_id у всех NULL.
да потому что это prepared-запросы, которые не выполняются в данный момент.
AtanasКак без трейса определить какой из них в рамках нужной транзакции открыт?
transaction_id будет не null (и не 0).
...
Рейтинг: 0 / 0
Информация по транзакции
    #40099539
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

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

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

prepare в транзакции выполняется судя по API. Как минимум транзакция туда передаётся.
Может ли помочь информация в какой транзакции препарирован запрос хз.
Если препарирование и выполнение в одной транзакции происходит, то наверное да.
В остальных случаях информация скорее всего несёт мало смысла.
...
Рейтинг: 0 / 0
Информация по транзакции
    #40099557
Фотография 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
Информация по транзакции
    #40099560
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvиз транзакции аттачмент как раз понятен

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

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

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

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

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

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

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

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

это stalled ;-) А idle - это запрос препарирован, но не выполняется. Либо еще, либо уже (выполнился, курсор закрыт, но запрос не освобожден).
...
Рейтинг: 0 / 0
Информация по транзакции
    #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
Информация по транзакции
    #40099581
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
ввести ещё один столбец prepared_transaction_id

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

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

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


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


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

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


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