在 Oracle 中有一个视图V$TRANSACTION
,其中包含每个未提交事务的行。没有从外部查看该事务的性质的机制(除非您在代码中内置了工具,例如通过使用DBMS_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 thang。但是,具有适当权限的用户可以将此查询转换为视图并授予对常规 joes 的访问权限。
作为一个感兴趣的问题,无论如何,你想做什么?假设工作单元在两次更新中被正确定义,那么只提交一次肯定是错误的。如果您只想知道发生了这种异常终止,那么您需要某种形式的跟踪或日志记录。
编辑
Bob Jarvis建议使用DBMS_TRANSACTION.LOCAL_TRANSACTION_ID()
. 这是一个比手工视图更好的建议。V$TRANSACTION 视图也可用于监控来自其他会话的未提交事务。