【发布时间】:2018-08-02 20:26:59
【问题描述】:
在 Spring JDBC 中处理约束冲突的最佳/最正确方法是什么?
作为一个真实的例子。我有一个users 表,其中包含url_slug 和email 列。这两个都是独一无二的。在创建新记录或更新现有记录时,如果我尝试让一条记录包含此表中另一条记录的重复值,我想将一个合理的错误返回给调用者。
我能想到的唯一选择都是有缺陷的。我在 Postgres 10 中这样做,使用 Spring NamedParameterJdbcTemplate 以防万一。
在执行 INSERT/UPDATE 之前检查数据。
这将涉及对每个插入/更新调用的额外查询,并且有一个竞争条件,这意味着它可能仍然无法捕获它。即
- 线程 1 开始事务
- 线程 2 开始事务
- 线程 1 查询数据
- 线程 2 查询数据
- 线程 1 确实更新了
- 线程 2 确实更新了
- 线程 1 确实提交了
- 线程 2 确实提交了
处理DuplicateKeyException。
这里的问题是它在事务提交之前不会被抛出,此时可能不清楚究竟哪个 SQL 调用失败、哪个约束失败或其他类似情况。
【问题讨论】:
标签: spring postgresql jdbc spring-jdbc jdbctemplate