oracle select 和 concurrent insert :: 检查电子邮件可用性
Posted
技术标签:
【中文标题】oracle select 和 concurrent insert :: 检查电子邮件可用性【英文标题】:oracle select and concurrent insert :: To check email availability 【发布时间】:2014-10-16 08:47:21 【问题描述】:我们有一个简单的案例,我们有一个包含 emailId 列的表,即唯一......使用 oracle DB
问题#1 多个并发用户可以检查某些电子邮件 ID 是否可用。像 2 个用户一样同时检查可用性:abc@test.com
session1:从 user_table 中选择 emailid; //如果不存在,则允许用户完成其余的过程并插入信息
session2:从 user_table 中选择 emailid;
现在两个会话都将得到此电子邮件 ID (abc@test.com) 可用并且都尝试插入,我知道其中一个会在插入时出错,但我们如何确保只有 1 个用户获得可用性和其他选择后不可用??
问题#2 同样,如果两个会话都插入了相同的值,那么首先会成功,是否有第二个会话更新该行而不是抛出错误的方法。就像我们有另一个时间戳列并且想要第二个会话而不是抛出错误简单地更新时间戳列?
【问题讨论】:
【参考方案1】:由于这是一个相当抽象的问题,这里仅提供一些一般性指导:
-
要处理表中的并发插入,您需要一个unique index,并在代码中准备好处理ORA-00001 error unique constraint violated。 从不只依赖check before insert(除非你以某种方式独占访问你的表——即使是这样......就我自己而言,我会添加一个唯一索引:花费不多,而且让我睡得更好)
Oracle 有一个
MERGE
语句,允许您根据条件更新或插入。此操作有时称为 upsert。通过使用该键,您应该能够找到更多信息例如,请参阅 Oracle: how to UPSERT (update or insert into a table?)。
现在,关于您的具体案例的一些想法(也许):
系统按照您的建议工作的唯一方法是在您检查可用性时进行某种预订(即:立即插入行,而不仅仅是选择)。然后在用户确认时更新该行。 但是这意味着:(1) 您将不得不以某种方式处理从未确认的预订 (2) 不会让您拥有唯一索引,并处理 ORA-00001 .
【讨论】:
以上是关于oracle select 和 concurrent insert :: 检查电子邮件可用性的主要内容,如果未能解决你的问题,请参考以下文章