这是通过Web应用程序/ Web服务注册成员的用例。我们有一个复杂的算法,通过查看电话,地址等多个表来检查成员是否重复。算法根据成员的国家/地区而有所不同。因此,使用主键/唯一键约束无法实现此限制。
所以我们在Java代码中进行了检查。但是,如果有2个重复的并发请求,则2个Java线程会看到该成员不存在,并且它们都插入了导致重复的记录。如何防止此类重复插入?
我可以通过使用行级锁或Hibernate的乐观并发来阻止更新。我可以考虑使用表级锁来防止此类插入,但会限制应用程序性能,因为它还会阻止更新。我认为另一个选项是创建一个带有id ='memberInsert'的记录的锁表,并通过JDBC强制所有插入来获得该记录的行级锁。
由于 Suneel
答案 0 :(得分:3)
如果它将在任何地方,我希望它在写入触发器中,而不是在Java代码中。应用程序的某些其他应用程序或某些其他区域可能会做得很糟糕。
在数据库上卸载它有两个优点。 1)它可以防止你在那里提到的竞争条件; 2)它通过不允许某些错误的应用程序修改将它们置于非法状态的记录来保护数据的完整性。
答案 1 :(得分:1)
您不能对算法的结果进行哈希处理,只是将其用作唯一的主键吗?
只要数据库不了解您的要求,它就无济于事。然后你可能没有其他选择而不是表级锁定。