在执行之前自动提交DDL语句的解决方法

时间:2012-04-27 16:57:11

标签: oracle

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

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

1 个答案:

答案 0 :(得分:0)

在Oracle下的一个原子事务中没有办法使用DML和DDL。

在Oracle中,DDL将始终在运行DDL之前显式地导致提交。

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

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

这个想法是第二步比第一步更容易失败。

还使用了这种模式,您需要处理类似JMS + JDBC的内容,并且不能使用JTA事务将JMS + JDBC活动包装在单个事务中。