自动提交设置为 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 时的完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

数据库系统概念:事务完整性约束

坚持时的教义关联完整性约束

完整性约束

表——完整性约束

MySQL完整性约束

Mysql 完整性约束