Oracle: как узнать, ожидает ли транзакция?

Я ищу способ узнать, имеются ли в текущем сеансе операторы INSERT, UPDATE или DELETE без ограничений. Один из способов – проверить v $ lock с текущим sid, но для этого требуется доступ для чтения к блокировке v $, что является проблемой, если администратор базы данных не хочет ее предоставлять. Любые другие способы (кроме отслеживания всех команд базы данных, выданных приложением)?

вы можете проверить, имеет ли ваш сеанс строку в 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; 
  • Firebase runTransaction не работает - MutableData имеет значение null
  • Откат вложенной / дочерней транзакции
  • EJB-транзакции в локальных методах-вызовах
  • Операционная система Android
  • Как TransactionScope откатывает транзакции?
  • Фиксация «Тайм-аут блокировки ожидания превышен; попробуйте перезапустить транзакцию «за« застрявшую »таблицу Mysql?
  • Django: как я могу защитить от одновременной модификации записей в базе данных
  • Как сделать большие неблокирующие обновления в PostgreSQL?
  • Дублирование fragmentов на транзакции fragmentов
  • Каков уровень изоляции транзакций по умолчанию для SQL Server с ADO.NET?
  • javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional
  • Давайте будем гением компьютера.