Oracle: как узнать, ожидает ли транзакция?
Я ищу способ узнать, имеются ли в текущем сеансе операторы INSERT, UPDATE или DELETE без ограничений. Один из способов – проверить v $ lock с текущим sid, но для этого требуется доступ для чтения к блокировке v $, что является проблемой, если администратор базы данных не хочет ее предоставлять. Любые другие способы (кроме отслеживания всех команд базы данных, выданных приложением)?
- Как обойти отсутствие транзакций в MongoDB?
- TransactionScope с файлами в C #
- Как откатить транзакцию базы данных при тестировании служб с помощью Spring в JUnit?
- Соответствующий шаблон является строгим, но для элемента 'tx: annotation-driven'
- Вам нужна транзакция базы данных для чтения данных?
- TransactionScope автоматически переходит на MSDTC на некоторых машинах?
- Являются ли функции PostgreSQL транзакционными?
- Каков «лучший» способ делать распределенные транзакции в нескольких базах данных с использованием Spring и Hibernate
вы можете проверить, имеет ли ваш сеанс строку в V$TRANSACTION
(очевидно, что для этого представления требуется привилегия чтения):
SQL> SELECT COUNT(*) 2 FROM v$transaction t, v$session s, v$mystat m 3 WHERE t.ses_addr = s.saddr 4 AND s.sid = m.sid 5 AND ROWNUM = 1; COUNT(*) ---------- 0 SQL> insert into a values (1); 1 row inserted SQL> SELECT COUNT(*) 2 FROM v$transaction t, v$session s, v$mystat m 3 WHERE t.ses_addr = s.saddr 4 AND s.sid = m.sid 5 AND ROWNUM = 1; COUNT(*) ---------- 1 SQL> commit; Commit complete SQL> SELECT COUNT(*) 2 FROM v$transaction t, v$session s, v$mystat m 3 WHERE t.ses_addr = s.saddr 4 AND s.sid = m.sid 5 AND ROWNUM = 1; COUNT(*) ---------- 0
Это запрос, который я обычно использую,
select s.sid ,s.serial# ,s.username ,s.machine ,s.status ,s.lockwait ,t.used_ublk ,t.used_urec ,t.start_time from v$transaction t inner join v$session s on t.addr = s.taddr;
SELECT * FROM V $ TRANSACTION WHERE STATUS = ‘ACTIVE’;
См .: http://forums.oracle.com/forums/thread.jspa?threadID=691061
Также см…
Как я могу узнать, не работает ли я в транзакции Oracle?
Используйте запрос ниже, чтобы узнать о ожидающей транзакции.
Если он возвращает значение, это означает, что существует ожидающая транзакция.
Вот запрос:
select dbms_transaction.step_id from dual
;
Рекомендации:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.html http://www.acehints.com/p/site-map.html
Самое простое и надежное решение – попытаться запустить транзакцию и увидеть ее, если она будет успешной. Если какой-то код уже начал транзакцию, но еще не выпустил ни один DML, то представление V $ TRANSACTION ничего не покажет.
В этом примере ниже я обрабатываю исключение, чтобы повысить пользовательскую ошибку приложения. Чтобы отложить до существующего обработчика исключений, просто сделайте SET TRANSACTION, а затем немедленно COMMIT, чтобы отменить его.
DECLARE transaction_in_progress EXCEPTION; PRAGMA EXCEPTION_INIT(transaction_in_progress, -1453); BEGIN SET TRANSACTION NAME 'CHECK_FOR_TRANSACTION_ALREADY_SET'; COMMIT; -- end transaction EXCEPTION WHEN transaction_in_progress THEN RAISE_APPLICATION_ERROR(-20000,'Transaction is already in progress'); END; /
Мэтью Уотсон может быть изменен для использования в RAC
select t.inst_id ,s.sid ,s.serial# ,s.username ,s.machine ,s.status ,s.lockwait ,t.used_ublk ,t.used_urec ,t.start_time from gv$transaction t inner join gv$session s on t.addr = s.taddr;