0

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

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

4

1 回答 1

0

在 Oracle 下,没有办法在一个原子事务中拥有 DML 和 DDL。

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

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

然后运行你的 DML ,只有在 DDL 成功的情况下,但是再一次,有这个 DML 失败的问题,然后无法回滚 DDL,此时你只需要运行另一个 DDL 来恢复第一个 DDL 所做的更改。

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

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

于 2012-04-27T17:06:37.083 回答