【发布时间】:2019-03-18 06:11:26
【问题描述】:
这是一个用例,其中唯一键约束可能因帐户而异。所以不能使用主键/唯一键约束来实现重复限制。
假设我们有表 T1,其中包含 C1、C2、C3、C4、C5 列,并且我们有两个帐户 A1 和 A2。 A1 和 A2 的数据进入同一个表 T1。但是为了获得账户 A1 的唯一记录,我们考虑 C1 和 C2 列,而对于账户 A2,我们考虑 C3 和 C3。同样,我们可以有许多帐户,每个帐户都有不同的列集来识别唯一记录。
所以我们在 Java 代码中进行了检查。但是,如果有 2 个重复的并发请求,则 2 个 Java 线程会看到该成员不存在,并且它们都插入了导致重复的记录。如何防止此类重复插入?
我可以通过使用行级锁或 Hibernate 的乐观并发来防止更新。我可以考虑使用表级锁来防止此类插入,但会限制应用程序性能,因为它还会阻止更新。
【问题讨论】:
-
要么修复你的模型,要么不要使用 sql。 :-(
-
不同的列不能有不同的主键。正如@Strawberry 所建议的,您需要修复您的模型。您可以有一个帐户 ID 列和只有一组列(例如 C1 和 C2)。使用帐户 ID 和列创建复合键(可能是 accid & col1 或 acc id & col2 或 accid, Col1, Col2