1

这是通过 Web 应用程序/Web 服务注册会员的用例。我们有一个复杂的算法来检查成员是否重复,方法是查看电话、地址等多个表格。该算法因会员所在国家/地区而异。所以这个限制不能使用主键/唯一键约束来实现。

所以我们在 Java 代码中进行了检查。但是,如果有 2 个重复的并发请求,则 2 个 Java 线程会看到该成员不存在,并且它们都插入了导致重复的记录。如何防止此类重复插入?

我可以通过使用行级锁或 Hibernate 的乐观并发来防止更新。我可以考虑使用表级锁来防止此类插入,但会限制应用程序性能,因为它也会阻止更新。我认为另一种选择是创建一个带有 id='memberInsert' 的记录的锁表,并通过 JDBC 强制所有插入以获取该记录的行级锁。

谢谢 Suneel

4

2 回答 2

3

如果它将在任何地方,我希望它在写触发器中,而不是在 Java 代码中。其他一些应用程序或应用程序的其他一些区域可能会做一些不好的事情。

在数据库上卸载它会给您带来两个好处。1)它可以防止您在上面提到的竞争条件; 2)它通过不允许某些错误的应用程序修改将它们置于非法状态的记录来保护数据的完整性。

于 2011-11-08T21:24:00.980 回答
1

你不能对算法的结果或其他东西进行散列并简单地将其用作唯一的主键吗?

只要数据库不了解您的要求,它就不会帮助您。然后你可能除了表级锁定别无选择。

于 2011-11-08T21:24:43.613 回答