当前位置: 首页 > 知识库问答 >
问题:

Oracle选择并发插入:: 检查电子邮件可用性

黄俊誉
2023-03-14

我们有一个简单的案例,我们有一个带有列emailId的表,即唯一的......使用oracle DB

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

会话1:从user_table中选择电子邮件id;如果不存在,则允许用户完成该过程的其余部分

会话2:从user_table中选择电子邮件id;

现在,两个会话都将获得此电子邮件ID(abc@test.com)可用

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

共有1个答案

夹谷烨赫
2023-03-14

由于这是一个相当抽象的问题,这里仅提供一些一般性指导:

  1. 要处理表中的并发插入,您需要一个唯一索引,并在代码中准备好处理ORA-00001错误,即违反了唯一约束。永远不要只依赖于插入前检查
    (除非您以某种方式独占访问您的表——即使如此……对于我自己,我会添加一个独特的索引:不需要花费太多,让我睡得更好)
  2. Oracle有一个<code>MERGE<code>语句,允许您根据条件进行更新或插入。此操作有时称为upsert。通过使用该键,您应该能够找到更多信息
    请参阅Oracle:如何升级(更新或插入到表中?)例如

现在,关于您的具体案例的一些想法(可能):

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

 类似资料:
  • 我有一个包含两列的表:k(主键)和value。我想: 选择k进行更新,如果找不到k,则插入默认值的新行。 对返回的值(存在的或新插入的行值)进行一些处理。 更新行并提交。 是否可以使此“选择更新并在未找到时插入默认值”? 如果将(1)实现为select/check if found/insert if not found,我们会遇到并发问题,因为两个会话可能会在不存在的键上并发地进行选择,两个会话

  • 问题内容: 我有兴趣在收到来自具有特定主题的特定地址的电子邮件时触发某些操作。为了能够做到这一点,我需要对邮箱进行监视,检查每个传入的邮件(特别是我使用gmail)。最简单的方法是什么? 问题答案: Gmail提供了通过POP进行连接的功能,您可以在gmail设置面板中将其打开。Python可以使通过POP的连接非常容易: 您只需要将此脚本作为cron作业运行即可。不确定您使用的平台如何,YMMV

  • 我有两个php值,分别是$email和$pass。 email-MySQL数据库中的行名称password-MySQL数据库中的行名称 我正在运行一个sql查询,从电子邮件=$email和密码=$pass的表成员中进行选择。 然后我运行mysqli_query,看看是否存在一行,我没有得到任何结果。回声肯定会回声出信息匹配的地方的ID。

  • 在继续本章之前,有两个方面需要理解。 它们是Check and Fetch 。 在JavaMail中Check电子邮件是我们打开邮箱中的相应文件夹并获取每条消息的过程。 这里我们只检查每条消息的标题,即From, To, subject 。 内容未被阅读。 在JavaMail中Fetch电子邮件是我们打开邮箱中的相应文件夹并获取每条消息的过程。 除了标题,我们还通过识别内容类型来阅读内容。 要使用

  • 主要内容:Oracle INSERT INTO SELECT语句概述,Oracle INSERT INTO SELECT示例在本教程中,您将学习如何使用Oracle 语句将数据从语句的结果中插入到表中。 Oracle INSERT INTO SELECT语句概述 有时候,想要将从其它表中选择数据并将其插入到另一个表中。要做到这一点,可使用Oracle 语句,如下所示: Oracle 语句要求源表和目标表匹配数据类型。 Oracle INSERT INTO SELECT示例 1. 插入所有销售数据

  • 试图解决使用Oracle APEX5 11g发送电子邮件的问题。我已按照Oracle说明设置了管理设置: SMTP主机地址-定义SMTP服务器的服务器地址。默认情况下,在安装时,这被设置为localhost。如果将另一台服务器用作SMTP中继,请将此参数更改为该服务器的地址。 SMTP主机端口-定义SMTP服务器侦听邮件请求的端口。默认设置为25。 SMTP身份验证用户名-如果输入用户名,Orac