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
您可以在此处阅读他们的工作:
发布您的样本数据和预期结果。对计数添加检查约束怎么样?