【发布时间】:2015-05-15 02:45:52
【问题描述】:
我有一个以@id 作为输入参数的存储过程。表Student 在Id_Column 和Count_Column 上有主键。如果表中存在给定id 的任何记录,则我从表中选择最大Count_Column 并通过将max Count_Column 增加1 来插入新行,否则为零值。
我正在从 WCF 服务中的 ado.net 代码调用此存储过程,并且此服务是从 asp.net Web 应用程序调用的。
这个存储过程在正常情况下工作正常,但是当多个用户同时调用它时,会发生主键冲突问题,同样的情况我也通过使应用程序多线程来重现。我知道这个问题与并发有关,最初我在选择查询中使用with(nolock),但现在我已将其删除。
我在某处读过,通过设置事务隔离级别可以解决它,但是当我尝试时,我遇到了一些回滚事务异常。
请告诉我此问题的任何有效解决方案。
declare @iCount = 0;
if exists(select 'x' from Student with(nolock) where Id_Column = @iId)
begin
set @iCount = (select max(Count_Column)
from Student
where Id_Column = @iId)
end
insert into Student
values(@id, @iCount + 1);
第二个解决方案:
begin try
set transaction isolation level serializable
begin transaction
declare @iCount = 0;
if exists(select 'x' from from Student with(nolock) where Id_Column = @iId)
begin
set @iCount = (select max(Count_Column)
from Student
where Id_Column = @iId)
end
insert into Student
values(@id, @iCount + 1);
commit transaction
end try
begin catch
rollback transaction
end catch
【问题讨论】:
-
你听说过
Auto Incremented fields -
你可以考虑使用
sp_getapplock。 -
您是否正确阅读了我的问题? @MethodMan
-
这是 SQL Server 具有/允许以这种方式设置自动增量的列,当您执行插入时,您确保 Id 字段是具有自动增量和正确查看功能的主键如有必要进行设置,然后在调用插入时插入除 Id 字段之外所需的所有内容,因为它将自动生成.. 还阅读一些关于基本查询和在 sql server 中设置自动增量字段的教程
-
哥们休息一下看书
标签: c# sql asp.net sql-server stored-procedures