В нашем приложении существует обновление базы данных, которое фиксируется только после того, как последовательное обновление выполняется (оба использования той же транзакции, конечно). Однако мы обнаружили редкий поток, в котором пользователь выходит из приложения перед вторым обновлением, заставляя первое быть отброшенным. Я ищу способ распознать это незафиксированное обновление на выход.
Я знаю проблемы как этот призыв к модернизации, но этому не возможному. Из-за редкости потока и структуры приложения, я задаюсь вопросом, существует ли способ просто проверить саму транзакцию на незафиксированные обновления.
Вопрос допустим для Oracle и SQLServer. Приложение записано в PowerBuilder, но это может быть расширено различными способами (.NET, Win32 и т.д.), если это имеет значение.
В Oracle можно вызвать СУБД_TRANSACTION.local_transaction_id. При этом будет возвращен либо уникальный идентификатор текущей транзакции, либо NULL, если ни одна транзакция не активна.
Share and enjoy.
.Это может быть полезно
Возвращает число активных сделки на текущий момент соединение.
Если вы на PB11.5 и используете пользовательский объект транзакции, то сделать что-то, что не зависит от СУБД, довольно просто. В событии SQLPreview объекта транзакции, просто включите булевую опцию, когда проходит INSERT, UPDATE или DELETE, а затем выключите ее, когда проходит COMMIT или ROLLBACK.
На самом деле, не так уж и сложно подкачать в пользовательском объекте транзакции, если вы используете SQLCA: Приложения, Свойства, Дополнительные свойства, Типы переменных, SQLCA. Если вы используете много отдельных соединений с базой данных с большим количеством операторов "CREATE transaction" (стандартный поиск PB может найти это, или PBL Peeper может помочь вам найти это с переменным количеством пробелов между словами), то реализация этого будет сложнее, но не невозможнее.
И, ради полноты, чтобы создать пользовательский объект транзакции, Файл / Новый / Объект PB / Стандартный класс / Транзакция. У вас есть объект обычного пользователя, в котором вы можете определить Instance Variables (как в предложенном мною булеве) и события скрипта (как в предложенном мною событии SQLPreview), а также функции (вы можете захотеть создать интерфейс для этой функциональности, чтобы скрыть детали в случае, если вы захотите расширить ее в будущем). Обратите внимание, что SQLPreview недоступен на объекте Транзакции до 11.5. (Для тех, кто думает, что это звучит знакомо до 11.5, DataWindow реализует SQLPreview.)
Удачи,
Терри.
. В Oracle есть вид V$TRANSACTION
, который содержит строку для каждой нефиксированной транзакции. Механизм просмотра природы этой транзакции извне отсутствует (если только в код не встроена инструментальная панель, например, с помощью СУБД_APPLICATION_INFO.SET_MODULE()
). Однако в текущей сессии можно посмотреть, есть ли у нее такая нефиксированная работа:
SQL> select t.status
2 from v$transaction t
3 join v$session s
4 on s.saddr = t.ses_addr
5 where s.sid = sys_context('userenv', 'sid')
6 /
STATUS
----------------
ACTIVE
SQL>
Если нефиксированных транзакций нет, то этот запрос вернет NO_DATA_FOUND. По умолчанию V$-виды не предоставляются пользователям, так как на самом деле они являются DBA-тагангом. Однако, пользователь с соответствующей привилегией может превратить этот запрос в представление и предоставить доступ к обычным joes.
В качестве вопроса, представляющего интерес, что бы ты хотел сделать? Предположим, что Единица работы корректно определена в объявлениях о двух обновлениях, конечно, было бы неправильно делать только одно. Если все, что вы хотите знать - это то, что произошло это ненормальное завершение, то это то, что вам нужно.
edit
Bob Jarvis предлагает с помощью DBMS_TRANSACTION.LOCAL_TRANSACTION_ID()
. Это предложение лучше, чем ручная работа. Представление V$TRANSACTION может также использоваться для мониторинга нефиксированных транзакций из других сессий.
Для облегчения поиска и устранения неисправностей в вашем сценарии вы, возможно, захотите рассмотреть использование явных именованных локальных транзакций, наряду с использованием опции "С МАРКОЙ". Это позволяет вам записывать имя явной транзакции в журнал транзакций, который вы, конечно, можете просмотреть на более позднем этапе, чтобы определить последовательность событий, которые произошли.
Смотрите Книги SQL Server Books Online: Отмеченные транзакции
В SQL Server запустите это:
IF @@TRANCOUNT>0 BEGIN
ROLLBACK;
END;
В SQL Server 2005/2008 можно использовать DMV. Прочтите эту статью