在Spring JDBC中处理约束违例的最佳/最正确方法是什么?
作为一个真实的例子。我有一个users
表,其中包含url_slug
和email
的列。这两个都是独一无二的。创建新记录或更新现有记录时,如果我尝试使一个记录包含此表中另一个记录的重复值,我想将一个明智的错误返回给调用者。
我能想到的唯一选择都是有缺陷的。我在Postgres 10中这样做,使用Spring NamedParameterJdbcTemplate,以防万一。
这将涉及对每个插入/更新调用的额外查询,并且具有竞争条件,这意味着它可能仍然无法捕获它。即。
DuplicateKeyException
。这里的问题是,在提交事务之前不会抛出它,此时可能不清楚究竟哪个SQL调用失败,哪个约束失败,或者其他类似的事情。
答案 0 :(得分:0)
没有最好的"处理这些异常的方法,除了将它放入try catch块并将错误消息传播回用户。
当然,在您的示例中,问题是您很可能不希望使用Serializable
隔离级别,它基本上逐个执行每个事务,确保不会发生这种情况。另一种方法是锁定整个交易的表格,但我也不建议。
只需将您的交易调用放入try-catch块并根据需要进行处理。