оРАКля, активная транзакция без сессии

bleyman

У меня упала программа. При попытке её перезапустить, обнаружилось что кто-то держит лок на некий ряд в одной таблице.
У заблокированной сессии (которая тупо делает "delete from my_table") blocking_session пустая, blocking_session_status=UNKNOWN, event="enq: TX - row lock contention". dba_blockers, dba_2pc_pending (программа вроде использует XA) — пустые.
Дальше ещё интересней: в v$transactions обнаружилась единственная, висящая примерно с момента падения активная транзакция. Её ses_addr не соответствует ни одной из сессий в v$sessions.
Как так может быть? Как можно по транзакции узнать какие-нибудь интересные вещи типа чего она ждёт, какие sql в ней выполнялись, какие объекты она потрогает если её закоммитить, и тому подобное? Можно ли что-нибудь интересное вытащить из ses_addr, я так понимаю это тупо адрес в памяти и у оракли есть какие-то низкоуровневые вью которые на самом деле прямо на пямять смотрят?

mbolik1

После падения транзакции идёт её откат, который может занимать времени больше чем была сама транзакция. Скорее всего это оно.
Если это так то можешь посмотреть с какой скоростью убывает USED_UBLK и оценить сколько ещё осталось.
P.s. Ну да я понял что слегка опоздал.

bleyman

Не, транзакция и всякие её атрибуты вообще не менялись. Она просто висела. Причём она продолжала висеть даже после того, как row lock внезапно снялся.
Да и не делалось там никаких особо страшных вещей, типа, если ты думаешь про инсерт на миллион рядов в global temporary table, затем убить транзакцию внезапно и потом GC жрёт 100% проца часа два — нет, там были сотни инсертов в лучшем случае.
Оставить комментарий
Имя или ник:
Комментарий: