SQL(Microsoft) - 同时更新2个

use*_*049 2 sql sql-server

我有一张桌子

create table lastnum
(
 id int,
 num int
)
Run Code Online (Sandbox Code Playgroud)

它有一排

Id    num

1     101
Run Code Online (Sandbox Code Playgroud)

2个用户同时执行相同的存储过程 - 存储过程是

declare @num int

set @num = (select num + 1 from lastnum where id = 1)

update lastnum
set num = @num
where Id = 1

return @num
Run Code Online (Sandbox Code Playgroud)

在精确的微秒运行命令的可能性是什么,所以即使在两次调用之后,num的值也只有102

Joe*_*orn 5

该代码绝对可能"失败"并向两个用户提供相同的号码.

这是否真的可能在您的环境中发生取决于您的负载(如果此代码很少运行,您可能会侥幸逃脱)以及您的服务器配置方式.Sql Server具有不同的隔离级别,您可以使用它们来确定允许的潜在冲突程度.在最高隔离时,该代码是完全安全的(假设您的用户正在获得隐式事务)......但性能损失可能很严重.

Sql Server具有内置机制,您应该使用它来避免这些潜在的冲突:即identity列和scope_identity()函数.较新版本的Sql Server也有序列.

锁定提示或显式交易也可能对您有所帮助......但我会尽量避免这些以支持此答案中的其他选项.