gpt4 book ai didi

spring - 如何最好地处理 Spring JDBC 中的约束冲突

转载 作者:行者123 更新时间:2023-11-29 13:45:33 25 4
gpt4 key购买 nike

在 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 确实提交了 <-- Constraint Violation,即使在 #4 数据很好

处理DuplicateKeyException

这里的问题是它在提交事务之前不会抛出,此时可能不清楚到底是哪个 SQL 调用失败、哪个约束失败或类似的任何事情。

最佳答案

除了将其放入 try catch block 并将错误消息传播回用户外,没有“最佳”方法来处理此类异常。

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

只需将您的事务调用放入 try-catch block 中,并根据需要进行处理。

关于spring - 如何最好地处理 Spring JDBC 中的约束冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48936708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com