2011-11-08 50 views
1

这是通过Web应用程序/ Web服务进行成员注册的用例。我们有一个复杂的算法,通过查看多个表格(如电话,地址等)来检查成员是否重复。算法根据成员的国家而不同。所以这个限制不能用主键/唯一键约束来实现。在Oracle中不使用唯一密钥的情况下防止重复插入

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

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

感谢 Suneel

+0

您可以先确定该成员是否重复,然后根据该知识启动多个线程以完成多项任务。 – rid

+0

这些请求可能来自Web浏览器,Web服务客户端。所以请求线程创建不在我的控制之下。 – Suneel

+0

决赛桌不应该有独特的约束?我了解你必须检查多个来源的完整性的部分。 – r0ast3d

回答

3

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

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

+0

+1更好的解决方案。当他们使用Oracle时,他们甚至可以使用Java代码。 :) –

1

难道你不能哈希算法的结果或什么,只是用它作为唯一的主键?

只要数据库不知道你的要求,它不会帮助你。然后你可能没有其他的选择比表级锁定。

+0

有关使用散列的有趣想法。从来没有发生过我。 – Suneel

相关问题