自动提交设置为false时的完整性约束

时间:2015-11-18 20:23:57

标签: java oracle jdbc autocommit

我工作的服务使用JDBC API来更新Oracle数据库。更新数据库的方法之一是将autocommit设置为false以执行2个SQL语句。但即使autocommit设置为false,第一个SQL语句也会被执行,并且我们会收到完整性约束违规错误。

java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (V500.XFK3) violated - child record found  

不应禁用自动提交等待调用commit方法吗?如果不是,如何执行两个查询?

在禁用约束的表上,不会显示上述错误并执行查询。

1 个答案:

答案 0 :(得分:4)

约束是对操作的评估 - 而不是操作的提交。您需要做的是处理延迟约束,或以正确的顺序执行操作以避免外键违规。插入父项,然后执行孩子。

简要介绍可延迟约束和使用它们的一些微妙问题,启动here

但是,我强烈建议,数据库中的父子关系约束可能是出于正当理由而创建的 - 因此禁用约束是一个坏主意,会导致数据不良。应尽可能少地使用优选的约束。您可能认为必须弄清楚操作的正确顺序以满足约束是一种痛苦,但如果您使用UI直接使用DML,那么它是正确的方法。老实说,由于各种安全和维护原因隐藏了表格详细信息,因此我更倾向于将PL / SQL API暴露给外部世界。 UI应该只是说“存储此数据实体”,并且界面知道如何将它全部放在正确的表中。这样,后端可以重新设计以提高效率,而前端无需了解它。