oracle select和concurrent insert ::检查电子邮件可用性

时间:2014-10-16 08:47:21

标签: oracle select concurrency insert email-validation

我们有一个简单的案例,我们有一个包含列emailId的表,即使用oracle DB

的唯一.....

问题#1 多个并发用户可以检查某些电子邮件ID是否可用。像2个用户同时检查可用性:abc@test.com

session1:从user_table中选择emailid; //如果不存在,则允许用户完成剩余的过程。插入信息

session2:从user_table中选择emailid;

现在两个会话都将获得此电子邮件ID(abc@test.com)可用&两者都试图插入,我知道其中一个插入时会出错但是我们如何才能确保只有一个用户获得可用性&其他选择不可用??

问题#2 同样,如果两个会话都插入了相同的值,那么首先会成功,第二个会话是否有更新该行而不是抛出错误的方法。就像我们有另一列时间戳&想要第二个会话而不是抛出错误简单更新时间戳列?

1 个答案:

答案 0 :(得分:0)

由于这是一个相当抽象的问题,这里只是一些一般性指导原则:

  1. 要处理表格中的并发插入,您需要unique index,并在代码中做好准备以处理 ORA-00001 error unique constraint violated 从不仅依赖于check before insert (除非您以某种方式独占访问您的桌子 - 即使如此......就我自己而言,我会添加一个独特的指数:不会花太多钱让我睡得更好)

  2. Oracle有一个MERGE语句,允许您根据条件更新或插入。此操作有时称为 upsert 。通过使用该关键字,您应该能够找到更多信息。例如,请参阅Oracle: how to UPSERT (update or insert into a table?)

  3. 现在,关于你的具体案例的一些想法(也许):

    系统按照您的建议工作的唯一方法是在检查可用性时进行某种预留(即:立即插入行,而不是仅选择)。然后在用户确认时更新该行。 但是这意味着:(1)你必须以某种方式处理从未确认的预订(2),它不会让你拥有一个独特的索引,并处理 ORA -00001