【问题标题】:Integrity constraints when autocommit is set to false自动提交设置为 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  

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

在禁用了约束的表上,上述错误不会出现,并且会执行查询。

【问题讨论】:

标签: java oracle jdbc autocommit


【解决方案1】:

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

有关可延迟约束的简要介绍以及使用它们的一些微妙问题,请开始here

但是,我强烈建议,数据库中的父子关系约束可能是有充分理由创建的 - 因此禁用约束是一个坏主意,会导致错误数据。并且应尽可能少使用可延迟约束。您可能认为必须找出正确的操作顺序来满足约束是很痛苦的,但如果您让 UI 执行直接 DML,这是正确的方法。老实说,由于各种安全和维护原因,我更喜欢将 PL/SQL API 暴露给外界,并隐藏表的详细信息。 UI 应该只是说“存储此数据实体”,并且界面知道如何将其全部放入正确的表中。这样,可以重新设计后端以提高效率,而无需前端意识到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2012-07-11
    • 2015-04-11
    • 2020-01-14
    • 2012-01-31
    • 2019-01-19
    相关资源
    最近更新 更多