如何最好地处理Spring JDBC中的约束违规

时间:2018-02-22 20:34:40

标签: spring postgresql jdbc spring-jdbc jdbctemplate

在Spring JDBC中处理约束违例的最佳/最正确方法是什么?

作为一个真实的例子。我有一个users表,其中包含url_slugemail的列。这两个都是独一无二的。创建新记录或更新现有记录时,如果我尝试使一个记录包含此表中另一个记录的重复值,我想将一个明智的错误返回给调用者。

我能想到的唯一选择都是有缺陷的。我在Postgres 10中这样做,使用Spring NamedParameterJdbcTemplate,以防万一。

在执行INSERT / UPDATE之前检查数据。

这将涉及对每个插入/更新调用的额外查询,并且具有竞争条件,这意味着它可能仍然无法捕获它。即。

  1. 主题1开始交易
  2. 线程2开始交易
  3. 主题1查询数据
  4. 线程2查询数据
  5. 主题1确实更新
  6. 线程2确实更新
  7. 线程1确实提交
  8. 线程2提交< - 约束违规,即使#4数据还不错
  9. 处理DuplicateKeyException

    这里的问题是,在提交事务之前不会抛出它,此时可能不清楚究竟哪个SQL调用失败,哪个约束失败,或者其他类似的事情。

1 个答案:

答案 0 :(得分:0)

没有最好的"处理这些异常的方法,除了将它放入try catch块并将错误消息传播回用户。

当然,在您的示例中,问题是您很可能不希望使用Serializable隔离级别,它基本上逐个执行每个事务,确保不会发生这种情况。另一种方法是锁定整个交易的表格,但我也不建议。

只需将您的交易调用放入try-catch块并根据需要进行处理。