【问题标题】:Rollback DML after DDL failsDDL 失败后回滚 DML
【发布时间】:2013-12-09 21:39:05
【问题描述】:

我有一种情况,我必须:

  1. 对某些表禁用 FK 约束,
  2. 更改由外键引用的主键的字段值(也更新以匹配),
  3. 从第 1 步重新启用 FK 约束。

问题在于,如果从步骤 2 对主键字段所做的更改与外键引用的字段不一致,则在步骤 3 中重新启用约束可能会失败。我想抓住这种情况并回滚在步骤 2 中所做的更改。据我所知,运行像启用约束这样的 DDL 语句将首先发出提交,之后我无法回滚在步骤 2 中所做的更改。

有没有办法在一个独立的脚本中实现这一点?该过程应该完全通过或回滚,就好像什么都没发生一样。或者是否有替代事务可以恢复到以前的状态,而不需要对整个数据库进行备份/恢复?

【问题讨论】:

  • 这是一个单用户进程吗?如果是这样,您也许可以使用闪回表将相关表恢复到以前的版本。

标签: sql oracle transactions oracle11g ddl


【解决方案1】:

解决此问题的方法是在执行更新之前锁定每个表,在重新启用约束之前运行查询以手动检查任何违规行为。如果有任何违规可以回滚更新,否则约束重新启用将执行提交并释放表锁。

【讨论】:

    【解决方案2】:

    您可以尝试在自主事务中执行 DDL。这样,它将与您的 DML 隔离。如果 DDL 失败,您仍然可以回滚 DML。但是,如果 DDL 必须“看到”未提交的 DML 更改,那么您将陷入困境。我不认为你能到达你想去的地方。

    【讨论】:

    • 我正在禁用 FK 约束,以便在第 2 步中更改 PK/FK,因此我认为我无法将 DDL 与 DML 分开。
    • 是的,这是个问题。杰弗里上面的回答有意义吗?
    猜你喜欢
    • 2016-02-07
    • 2017-06-03
    • 1970-01-01
    • 2018-01-12
    • 2011-02-04
    • 2013-05-10
    • 2018-12-14
    • 2018-09-11
    相关资源
    最近更新 更多