尽管检查,但同时执行 Insert 命令将数据两次写入数据库

Executing Insert command at the same time writes the data twice to database despite a check

我需要检查数据库中是否存在类似数据并跳过该插入。这个问题可能看起来像是重复的,但我没有找到任何解决方案。 我正在使用 PostgreSQL 数据库并且我有一个 SQL 查询

INSERT INTO table_name (name, dob, mobile)
VALUES ('sam', '23-05-2000', '8070605040'); 

如果我 运行 这个命令两次,那么它应该只在检查 dob 和 mobile 的组合唯一性后插入一次,即如果我输入类似 ('tom', '23-05- 2000', '8070605040'), 不应输入。当命令 运行 一个接一个地执行时,我现有的代码有效。

但是如果我 运行 同时在 2 台设备上按下一个按钮,那么记录就会被输入两次。

运行代码后的结果

name     dob       mobile
sam   23-05-2000  8070605040

命令同时执行的结果

name     dob       mobile
sam   23-05-2000  8070605040
sam   23-05-2000  8070605040

即使有第二次延迟,现有代码也能正常工作。但是同时按字面执行不会检查,因为它还没有写入数据库。

我也不想在 table 本身上添加唯一条件,因为我没有正确理解数据并且想将其作为 SQL 查询来执行。 我该如何检查并防止这种情况发生。

谢谢。

If I run this command twice then it should only be inserted once after checking for the combined uniqueness of dob and mobile

仅当 dob/mobile 被声明为 unique 或具有 unique 索引时才成立。据推测,您需要:

alter table table_name add constraint unq_table_name_dob_mobile unique (dob, mobile);

有了唯一的index/constraint,数据库保证了数据的完整性。无论应用程序多么努力,数据库都不允许重复项进入 table。

如果要手动检查记录的唯一性,可以使用事务并锁定整个table:

BEGIN;
LOCK TABLE tbl IN EXCLUSIVE MODE; -- only allow read access
SELECT * FROM tbl WHERE a = 1 and b = 2;

--- if not existed, insert new record here
COMMIT;

这性能很差,只能用于这一特定需求。最好的解决方案是始终使用 UNIQUE INDEX.