加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – 没有“身份”获取下一个ID号的最佳方法

发布时间:2021-01-25 09:06:17 所属栏目:编程 来源:网络整理
导读:我必需在遗留数据库的表中插入一些记录,而且因为它被其他古代体系行使,因此变动表不是办理方案. 题目是方针表有一个int主键但没有标识类型.以是我必需找到下一个可用的ID并行使它: select @id=ISNULL(max(recid)+1,1) from subscriber 可是,我想阻止其他应用

我必需在遗留数据库的表中插入一些记录,而且因为它被其他古代体系行使,因此变动表不是办理方案.

题目是方针表有一个int主键但没有标识类型.以是我必需找到下一个可用的ID并行使它:

select @id=ISNULL(max(recid)+1,1) from subscriber

可是,我想阻止其他应用措施在我执行此操纵时插入到表中,以便我们没有任何题目.我试过这个:

begin transaction
    declare @id as int
    select @id=ISNULL(max(recid)+1,1) from subscriber WITH (HOLDLOCK,TABLOCK)
    select @id
    WAITFOR DELAY '00:00:01'
    insert into subscriber (recid) values (@id)
commit transaction
select * from subscriber

在SQL Management Studio中的两个差异窗口中,一个事宜老是作为死锁捐躯品被杀死.

我也实行了SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,功效沟通……

有什么好的提议,我怎么能确保我获得下一个id并行使它而不消担忧其他人(或我!)被冲洗?

很歉仄没有提到这个,但这是一个SQL 2000处事器以是我不能行使FOR UPDATE和OUTPUT之类的对象

更新:这是得当我的办理方案:

BEGIN TRANSACTION
    DECLARE @id int

    SELECT  @id=recid
    FROM    identities WITH (UPDLOCK,ROWLOCK)
    WHERE table_name = 'subscriber'

    waitfor delay '00:00:06'

    INSERT INTO subscriber (recid) values (@id)

    UPDATE identities SET recid=recid+1 
    WHERE table_name = 'subscriber'

COMMIT transaction

select * from subscriber

WAITFOR是这样的,我可以有多个毗连并多次启动查询以引发并发性.

感激Quassnoi的谜底以及全部其他孝顺的人!真棒!

办理要领

建设另一个表:
t_identity (id INT NOT NULL PRIMARY KEY CHECK (id = 1),value INT NOT NULL)

行使单行,锁定此行,并在每次必要IDENTITY时将值增进1.

要在单个语句中锁定,递增和返回新值,请行使:

UPDATE  t_identity
SET     value = value + 1
OUTPUT  INSERTED.value

假如您不想更新,只需锁定,然后发出:

SELECT  value
FROM    t_identity WITH (UPDLOCK,ROWLOCK)

这将锁定表直到事宜竣事.

假如你在行使ancient_table之前老是起首锁定t_identity,你将永久不会陷入僵局.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读