【问题标题】:Oracle - Transaction with a series of DDL statementsOracle - 带有一系列 DDL 语句的事务
【发布时间】:2014-08-11 00:19:24
【问题描述】:

我有一系列我想在事务中运行的重命名表 ddl 语句。在此期间,还将运行其他会话,这可能会劫持用于上述重命名的表并导致资源争用/死锁。

是否有可能在 Oracle 中实现?了解每个 ddl 语句将在每次执行后提交,这将释放表以供其他会话劫持。如何确保正在执行 DDL 语句的当前会话在其他会话可以访问表之前成功完成?

--LOCK TABLE a  
RENAME tbl a to b
--possible contention as commit release the lock on tbl a 

RENAME tbl b to c 

RENAME tbl c to d

--commit

【问题讨论】:

标签: oracle oracle11g oracle10g ddl


【解决方案1】:

Oracle 中的每个 DDL 语句都是一个事务。每个 DDL 语句都会导致数据字典中的少量或大量更改,例如 obj$。我不确定,但看看 Oracle 为确保锁定在其平台的早期版本中不存在问题所做的主要工作,我认为他们发现更容易提交每个 DDL 语句以保持锁定的时间较短并避免会话内或执行 DDL 的会话之间出现死锁。在某些情况下,您仍然可以感觉到 Oracle 内核在使用 ORA-600 的情况下不会锁定删除和创建许多对象。

作为一种解决方法,您可以使用几年前引入的数据模型版本控制。我没有使用它的工作经验,因为它对我的工作来说太受限制了,但是您可以通过谷歌搜索“基于版本的重新定义”或转到 Oracle manual 找到更多信息。它可能在您正在使用的 Oracle 许可版本中不可用。

作为一种解决方法,您可以在正常运行期间执行语句。但这通常会中断会话,除非您的用户正在执行的代码很容易自动恢复。请记住,每个对象都有一个 ID 和一个名称。更改名称可能不会更改 ID,因此需要刷新许多指向对象的指针,从而导致 ORA-4063 或类似问题。据我所知,Oracle 没有暂停/暂停会话。

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多