【问题标题】:Workaround to Auto Commit Of DDL Statements Before Execution执行前自动提交 DDL 语句的解决方法
【发布时间】:2012-04-28 01:06:37
【问题描述】:

我为我的网站保留了两个密码(据网站人类用户所知,实际上是相同的密码,但使用两种不同的算法和盐进行散列和加盐)。一个放在 WebUsers 表中,这是用户登录网站时验证密码的地方。另一种是oracle用户的密码,每个网站用户对应一个oracle用户。

在进行更改密码程序时,我必须在 WebUsers 表以及 oracle 中的事务中更改密码。问题是,DDL 语句 [alter user ...] 在执行任何操作之前提交。如果 [alter user ...] 失败并且在异常处理代码中我回滚事务,则不会回滚 WebUsers 表中的更改。有什么解决办法吗?

【问题讨论】:

  • 如果 DDL 失败,您不能将旧的哈希值存储在变量中并使用旧值再次更新您的 WebUsers 表吗?
  • 为什么将密码保存在 Oracle 和表中?您的身份验证无法合并,从而完全消除问题是有原因的吗?

标签: oracle


【解决方案1】:

在 Oracle 下,无法在一个原子事务中同时拥有 DML 和 DDL。

在 Oracle 中,DDL 总是会在运行 DDL 之前显式地导致提交。

通常在这类场景中,您应该首先执行最有可能失败的步骤,即在您的情况下为 DDL 'Alter User'。

然后运行您的 DML ,仅当 DDL 成功时,但又一次,存在 DML 失败的问题,然后无法回滚 DDL,此时您只需运行另一个 DDL还原第一个 DDL 所做的更改。

这个想法是第二步比第一步更有可能失败。

也使用了这种模式,您必须处理 JMS + JDBC 之类的东西,并且不能使用 JTA 事务将 JMS + JDBC 活动包装在单个事务中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2016-05-14
    • 2022-11-09
    相关资源
    最近更新 更多