自动提交设置为 false 时的完整性约束
Posted
技术标签:
【中文标题】自动提交设置为 false 时的完整性约束【英文标题】:Integrity constraints when autocommit is set to false 【发布时间】:2015-11-18 20:23:56 【问题描述】:我从事的一项服务使用 JDBC API 来更新 Oracle 数据库。更新数据库的方法之一将 autocommit 设置为 false 以执行 2 个 SQL 语句。但是,即使 autocommit 设置为 false,第一个 SQL 语句也会被执行,并且我们会收到一个完整性约束违规错误。
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (V500.XFK3) violated - child record found
不应该禁用自动提交等待调用提交方法吗?如果不是,如何执行这两个查询?
在禁用了约束的表上,上述错误不会出现,并且会执行查询。
【问题讨论】:
看看Deferrable Constraints 【参考方案1】:约束是对操作进行评估 - 而不是操作的提交。您需要做的是处理延迟约束,或者以正确的顺序执行操作以避免外键违规。插入父项,然后执行子项。
有关可延迟约束的简要介绍以及使用它们的一些微妙问题,请开始here
但是,我强烈建议,数据库中的父子关系约束可能是有充分理由创建的 - 因此禁用约束是一个坏主意,会导致错误数据。并且应尽可能少使用可延迟约束。您可能认为必须找出正确的操作顺序来满足约束是很痛苦的,但如果您让 UI 执行直接 DML,这是正确的方法。老实说,由于各种安全和维护原因,我更喜欢将 PL/SQL API 暴露给外界,并隐藏表的详细信息。 UI 应该只是说“存储此数据实体”,并且界面知道如何将其全部放入正确的表中。这样,可以重新设计后端以提高效率,而无需前端意识到这一点。
【讨论】:
以上是关于自动提交设置为 false 时的完整性约束的主要内容,如果未能解决你的问题,请参考以下文章