【问题标题】:ORA-14450 "attempt to access a transactional temporary table alreadyin use" with no autonomous transactionsORA-14450“尝试访问已在使用的事务临时表”,没有自治事务
【发布时间】:2014-11-24 18:12:57
【问题描述】:

我无法提供具体代码,因为解决方案属于机密。我想问一下,在某些情况下,在没有任何自治事务或 DDL 代码的情况下,是否可能出现错误 ORA-14450“尝试访问已在使用的事务临时表”。

这只会偶尔发生一次。该应用程序使用数据库过程和 oracle 表单。

提前致谢

【问题讨论】:

  • 可能意味着您的代码正在尝试删除 GTT。别再这样了,你不需要放弃 GTT。

标签: oracle transactions


【解决方案1】:

ORA-14450 表示您在临时表上有一个阻塞会话。找到阻塞会话并在需要时将其终止。

SELECT * FROM v$lock
  WHERE id1 = (SELECT object_id FROM all_objects WHERE owner = <schema_name> 
               AND object_name =<glb temp table>) --find which sessions lock the temp table

SELECT * FROM v$session WHERE sid =<above query result> --find their's sid and serial

ALTER SYSTEM KILL SESSION '<sid>,<serial>';

Credit

【讨论】:

    【解决方案2】:

    如果您的 GTT 是使用 on COMMIT PRESERVE ROWS 子句创建的,那么如果没有锁定它仍然无济于事。一旦用户对该表执行 DML 并完成事务,该表仍在使用中。如果事务提交,它不会显示在 v$lock 中。

    【讨论】:

      【解决方案3】:

      到 (gtt_table) 的更改表实际上已经停滞了几个小时...我实际上已经放弃了——然后我使用了这里给出的上述查询——使用了下面的查询——杀死了所涉及的会话(注意涉及——不是一定会阻塞会话),解决了这个问题。

      SELECT 'alter system kill session '''||s.sid||','||s.serial#||',@'||s.inst_id|| ''';' FROM gv$lock l, gv$session s WHERE l.id1 = (SELECT object_id FROM all_objects WHERE owner = '&ownernam' AND object_name='&tmptblname') 和 l.sid=s.sid 和 l.inst_id=s.inst_id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2021-10-13
        相关资源
        最近更新 更多