我们有一个简单的例子,我们有一张带有列emailId的表,即唯一的。。。。。使用oracle DB
问题#1多个并发用户可以检查某个电子邮件id是否可用。像2个用户一样,在同一时间检查以下内容的可用性:abc@test.com
session1:从user_table中选择emailid;//如果不存在,则允许用户完成该过程的剩余部分&插入信息
session2:从user_table中选择emailid;
现在两个会话都将获得此电子邮件id(abc@test.com)可用&两者都试图插入,我知道其中一个在插入时会出错,但我们如何确保只有一个用户获得可用性&其他选择时不可用??
问题#2另外,如果两个会话都插入了相同的值,那么第一个会话将成功,那么第二个会话是否可以更新该行而不是抛出错误。就像我们有另一列时间戳&想要第二个会话而不是抛出简单的错误更新时间戳列吗?
由于这是一个相当抽象的问题,这里只有一些通用指南:
- 要处理表中的并发插入,您需要一个唯一索引,并在代码中准备好处理违反的ORA-0001错误唯一约束永远不要只依赖插入前的检查
- Oracle有一个
MERGE
语句,允许您根据条件更新或插入。此操作有时被称为追加启动。通过使用该密钥,您应该能够找到更多信息
例如,请参阅Oracle:如何UPSERT(更新或插入到表中?)
现在,关于你的一些想法(也许):
系统按照您的建议工作的唯一方法是在检查可用性时进行某种预订(即:立即插入行,而不仅仅是选择)。然后在用户确认时更新该行但这意味着:(1)你将不得不以某种方式处理从未确认的预订(2)这不会让你拥有唯一的索引,并处理ORE-00001。