Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 确保只有一条记录插入到具有数千个并发用户的表中_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql 确保只有一条记录插入到具有数千个并发用户的表中

Sql 确保只有一条记录插入到具有数千个并发用户的表中,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,最近,我需要编写一个存储过程,以便在第一个用户出现并忽略其他用户时,只插入一条记录。我认为如果不存在,插入的将不适用于我。此外,一些人在网上说,合并增加了种族条件。有什么快速的方法可以做到这一点吗?这是我现在的代码 IF NOT EXISTS (SELECT ......) INSERT 您可以添加另一个表用作锁定机制 假设您的表名为a,具有锁定值的表名为check\u a: create table a (name varchar(10)) create table check_a (nam

最近,我需要编写一个存储过程,以便在第一个用户出现并忽略其他用户时,只插入一条记录。我认为
如果不存在,插入的
将不适用于我。此外,一些人在网上说,合并增加了种族条件。有什么快速的方法可以做到这一点吗?这是我现在的代码

IF NOT EXISTS (SELECT ......)
INSERT

您可以添加另一个表用作锁定机制

假设您的表名为
a
,具有锁定值的表名为
check\u a

create table a (name varchar(10))
create table check_a (name varchar(10))
仅向锁定表插入一条记录:

insert into check_a values ('lock')
go
然后创建一个存储过程,检查主表中是否有值。如果没有记录,我们可能会锁定表
中的唯一值,选中a
,然后将我们的值插入表
a

create proc insert_if_first
as
begin
    set nocount on
    if not exists (select name from a)
    begin
        declare @name varchar(10)
        begin tran
        select @name = name from check_a with (updlock)
        if not exists (select name from a)
        begin
            insert into a values ('some value')
        end
        commit
    end
end

go
从表
a
中选择的第一项检查是否没有记录,是为了尽可能低地使用系统资源。如果表
a
中有记录,我们可以跳过期初交易并跳过锁定行

第二个检查是确保在等待获取锁时,没有人向表
a
插入行

create proc insert_if_first
as
begin
    set nocount on
    if not exists (select name from a)
    begin
        declare @name varchar(10)
        begin tran
        select @name = name from check_a with (updlock)
        if not exists (select name from a)
        begin
            insert into a values ('some value')
        end
        commit
    end
end

go

这样,只有第一个可以锁定
检查a
的用户才能将值插入表
a

我猜您的意思是希望用户创建一个存储过程,确保只有一个用户可以运行该过程。然后需要使用隔离级别。有不同的隔离级别,所以您需要决定需要哪一个

create proc insert_if_first
as
begin
    set nocount on
    if not exists (select name from a)
    begin
        declare @name varchar(10)
        begin tran
        select @name = name from check_a with (updlock)
        if not exists (select name from a)
        begin
            insert into a values ('some value')
        end
        commit
    end
end

go
  • 读取未提交的
  • readcommitted
  • 可重复读取
  • SERIALIZABLE
您可以在此处阅读他们的工作:


发布您的样本数据和预期结果。对计数添加检查约束怎么样?