Сообщение, отменила ли транзакция фиксацию обновлений

В нашем приложении существует обновление базы данных, которое фиксируется только после того, как последовательное обновление выполняется (оба использования той же транзакции, конечно). Однако мы обнаружили редкий поток, в котором пользователь выходит из приложения перед вторым обновлением, заставляя первое быть отброшенным. Я ищу способ распознать это незафиксированное обновление на выход.

Я знаю проблемы как этот призыв к модернизации, но этому не возможному. Из-за редкости потока и структуры приложения, я задаюсь вопросом, существует ли способ просто проверить саму транзакцию на незафиксированные обновления.

Вопрос допустим для Oracle и SQLServer. Приложение записано в PowerBuilder, но это может быть расширено различными способами (.NET, Win32 и т.д.), если это имеет значение.

5
задан Doug Porter 27 December 2009 в 05:02
поделиться

7 ответов

В Oracle можно вызвать СУБД_TRANSACTION.local_transaction_id. При этом будет возвращен либо уникальный идентификатор текущей транзакции, либо NULL, если ни одна транзакция не активна.

Share and enjoy.

.
5
ответ дан 13 December 2019 в 05:36
поделиться

Это может быть полезно

@@TRANCOUNT (Transact-SQL)

Возвращает число активных сделки на текущий момент соединение.

4
ответ дан 13 December 2019 в 05:36
поделиться

Если вы на 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.)

Удачи,

Терри.

.
2
ответ дан 13 December 2019 в 05:36
поделиться

В 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 может также использоваться для мониторинга нефиксированных транзакций из других сессий.

.
1
ответ дан 13 December 2019 в 05:36
поделиться

Для облегчения поиска и устранения неисправностей в вашем сценарии вы, возможно, захотите рассмотреть использование явных именованных локальных транзакций, наряду с использованием опции "С МАРКОЙ". Это позволяет вам записывать имя явной транзакции в журнал транзакций, который вы, конечно, можете просмотреть на более позднем этапе, чтобы определить последовательность событий, которые произошли.

Смотрите Книги SQL Server Books Online: Отмеченные транзакции

0
ответ дан 13 December 2019 в 05:36
поделиться

В SQL Server запустите это:

IF @@TRANCOUNT>0 BEGIN
  ROLLBACK;
END;
0
ответ дан 13 December 2019 в 05:36
поделиться

В SQL Server 2005/2008 можно использовать DMV. Прочтите эту статью

0
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: