autocommit 设置为 false 时的完整性约束
Integrity constraints when autocommit is set to false
我从事的一项服务使用 JDBC API 更新 Oracle 数据库。更新数据库的方法之一将自动提交设置为 false 以执行 2 SQL 语句。但是即使 autocommit 设置为 false,第一个 SQL 语句也会被执行,我们会收到一个违反完整性约束的错误。
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (V500.XFK3) violated - child record found
禁用自动提交不应该等待提交方法被调用吗?如果不是,如何执行这两个查询?
在禁用约束的表上不会显示上述错误并执行查询。
约束是在操作上评估的——而不是操作的提交。您需要做的是要么处理延迟约束,要么以正确的顺序执行操作以避免违反外键。插入父项,然后执行子项。
要简要介绍可延迟约束以及使用它们的一些微妙问题,请开始 here
但是,我强烈建议,数据库中的父子关系约束可能是有充分理由创建的 - 因此禁用约束是一个坏主意,会导致错误数据。并且应尽可能少地使用可延迟约束。您可能认为必须找出正确的操作顺序以满足约束是一件痛苦的事情,但如果您让 UI 执行直接 DML,这是正确的方法。老实说,出于各种安全和维护原因,我更喜欢将 PL/SQL API 公开给外界,并隐藏 table 详细信息。 UI 应该只是说 "store this data entity" 并且界面知道如何将其全部放入正确的 table 中。这样就可以重新设计后端以提高效率,而不需要前端知道它。
我从事的一项服务使用 JDBC API 更新 Oracle 数据库。更新数据库的方法之一将自动提交设置为 false 以执行 2 SQL 语句。但是即使 autocommit 设置为 false,第一个 SQL 语句也会被执行,我们会收到一个违反完整性约束的错误。
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (V500.XFK3) violated - child record found
禁用自动提交不应该等待提交方法被调用吗?如果不是,如何执行这两个查询?
在禁用约束的表上不会显示上述错误并执行查询。
约束是在操作上评估的——而不是操作的提交。您需要做的是要么处理延迟约束,要么以正确的顺序执行操作以避免违反外键。插入父项,然后执行子项。
要简要介绍可延迟约束以及使用它们的一些微妙问题,请开始 here
但是,我强烈建议,数据库中的父子关系约束可能是有充分理由创建的 - 因此禁用约束是一个坏主意,会导致错误数据。并且应尽可能少地使用可延迟约束。您可能认为必须找出正确的操作顺序以满足约束是一件痛苦的事情,但如果您让 UI 执行直接 DML,这是正确的方法。老实说,出于各种安全和维护原因,我更喜欢将 PL/SQL API 公开给外界,并隐藏 table 详细信息。 UI 应该只是说 "store this data entity" 并且界面知道如何将其全部放入正确的 table 中。这样就可以重新设计后端以提高效率,而不需要前端知道它。