gpt4 book ai didi

SQL模拟自增字段

转载 作者:行者123 更新时间:2023-12-04 23:29:13 24 4
gpt4 key购买 nike

我们即将将我们的网站移至 windows azure,但遇到了 sql-azure 问题。由于性能优化,它们不支持标识增量属性。
因此,我们必须设计自己的逻辑来支持生成顺序标识的现有功能。

因此,为了生成唯一的序列值,我们从表的 ID 字段中获取 max(value) 并将其增加 1 以插入新记录。

我们现在必须管理并发事务,因此检查隔离级别。
但是,没有任何隔离级别锁定表以避免读取并发下的最大值。

任何有关锁定表或对此方法的评论的帮助都会非常有帮助。如果你们中的一些人已经以一种很好的方式克服了这个问题,那么你能分享一下吗?
谢谢你的帮助。

最佳答案

使用以下过程增加存储在单独表中的值。在主表上放置排他锁会导致可怕的并发问题。

CREATE PROCEDURE [dbo].[GetNextID](
@IDName nvarchar(255)
)
AS
BEGIN
/*
Description: Increments and returns the LastID value from tblIDs for a given IDName
Author: Max Vernon / Mike Defehr
Date: 2012-07-19

*/

DECLARE @Retry int;
DECLARE @EN int, @ES int, @ET int;
SET @Retry = 5;
DECLARE @NewID int;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET NOCOUNT ON;
WHILE @Retry > 0
BEGIN
BEGIN TRY
UPDATE dbo.tblIDs
SET @NewID = LastID = LastID + 1
WHERE IDName = @IDName;

IF @NewID IS NULL
BEGIN
SET @NewID = 1;
INSERT INTO tblIDs (IDName, LastID) VALUES (@IDName, @NewID);
END
SET @Retry = -2; /* no need to retry since the operation completed */
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205) /* DEADLOCK */
SET @Retry = @Retry - 1;
ELSE
BEGIN
SET @Retry = -1;
SET @EN = ERROR_NUMBER();
SET @ES = ERROR_SEVERITY();
SET @ET = ERROR_STATE()
RAISERROR (@EN,@ES,@ET);
END
END CATCH
END
IF @Retry = 0 /* must have deadlock'd 5 times. */
BEGIN
SET @EN = 1205;
SET @ES = 13;
SET @ET = 1
RAISERROR (@EN,@ES,@ET);
END
ELSE
SELECT @NewID AS NewID;
END
GO

(为了完整起见,这里是与存储过程关联的表)
CREATE TABLE [dbo].[tblIDs]
(
IDName nvarchar(255) NOT NULL,
LastID int NULL,
CONSTRAINT [PK_tblIDs] PRIMARY KEY CLUSTERED
(
[IDName] ASC
) WITH
(
PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
, FILLFACTOR = 100
)
);
GO

每次您想获得一个新的 ID 以在主表中使用时,您只需 EXEC GetNextID 'TableIDField';

关于SQL模拟自增字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19851907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com