sql – 没有“身份”获取下一个ID号的最佳方法
我必需在遗留数据库的表中插入一些记录,而且因为它被其他古代体系行使,因此变动表不是办理方案. 题目是方针表有一个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,你将永久不会陷入僵局. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |