java - 在 Oracle 中不使用唯一键防止重复插入

标签 java jdbc database-concurrency

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

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

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

谢谢 苏内尔

最佳答案

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

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

关于java - 在 Oracle 中不使用唯一键防止重复插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8057189/

相关文章:

java - 使用 Guice 注入(inject)字段对 Jersey Resources 进行单元测试

java - 使用 DAO Spring MVC 将行插入多个表

mysql - 事务并发性以防止读取旧版本的记录

Django 并发编辑

python - 运行并发请求时获取 "Invalid cursor state (0)"(SQLAlchemy & wsgi/python)

java - 将.SQLJ迁移到netbeans中的maven项目

java - 将 ArrayList 复制到二维数组的优雅方法

java - Hibernate:实体映射中的重复列

mysql - MySQL 和 jdbc 中的类似运算符和西里尔字母

postgresql - 使用保存点在 clojure.jdbc 和 postgres 中进行测试的嵌套事务