当一次有多个事务时,避免重复的最佳方法是什么?

问题描述 投票:-2回答:3

我有一个生产问题,基本上当同时批准超过1个用户。用户的公司代码是相同的。它应该是独一无二的。即使我尝试使用begin tran而没有锁定,仍然有可能仍然可以复制社区代码。因为select语句在更新表之前会给出相同的数量并保持不变。有什么办法可以解决这个问题。这是脚本。谢谢。

   declare @currentcompanycode as nvarchar(128)

    begin tran
    set @currentcompanycode = (select max(companycode) from tb_company with (nolock))

    update tb_company set companycode = @currentcompanycode + 1 where companyid = @companyid
    commit tran 
sql sql-server
3个回答
0
投票

当您第一次选择它的MAX(公司代码)时,您需要保持对tb_company表的锁定,直到您根据所选的值执行UPDATE:

set @currentcompanycode = 
(select max(companycode) from tb_company with (HOLDLOCK, TABLOCKX))

1
投票

使公司代码成为自动增量列,让数据库完成工作。


0
投票

使用OUTPUT子句

declare @newcompanycode table
(   
    companycode int
)

update  tb_company
set companycode = companycode + 1
output  inserted.companycode
into    @newcompanycode
where   . . . 

select * from @newcompanycode
© www.soinside.com 2019 - 2024. All rights reserved.