Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TSQL中,在标识字段上按顺序创建一组记录的最佳方法是什么?_Tsql - Fatal编程技术网

在TSQL中,在标识字段上按顺序创建一组记录的最佳方法是什么?

在TSQL中,在标识字段上按顺序创建一组记录的最佳方法是什么?,tsql,Tsql,我希望能够一次创建一组记录,并保证组的标识字段是连续的,在创建过程中不会因为其他人进入并创建记录而中断。我假设某种类型的表锁可以工作,但我不是sql专家,所以任何建议都会很感激什么类型的锁?有什么可能的问题吗?等等 作为一个小背景,表结构非常简单 TABLE PropertyCode ( Code INT IDENTITY, UserID INT ) 将特性代码指定给特性表中的特性。属性代码可以重复使用,它们打印在标志上,并且标志可以在多个属性之间旋转。在符号上打印连续的数字序

我希望能够一次创建一组记录,并保证组的标识字段是连续的,在创建过程中不会因为其他人进入并创建记录而中断。我假设某种类型的表锁可以工作,但我不是sql专家,所以任何建议都会很感激什么类型的锁?有什么可能的问题吗?等等

作为一个小背景,表结构非常简单

TABLE PropertyCode
(
    Code INT IDENTITY,
    UserID INT
)
将特性代码指定给特性表中的特性。属性代码可以重复使用,它们打印在标志上,并且标志可以在多个属性之间旋转。在符号上打印连续的数字序列要比打印随机数字便宜得多

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
SELECT * FROM PropertyCode
INSERT INTO PropertyCode ..... 
COMMIT TRAN
serializable transaction isolation(可序列化事务隔离)模式可防止会影响任何选定数据的插入/更新/删除,因此可使用SELECT*FROM PropertyCode


主要的问题是,在事务提交之前,没有其他进程可以更新/插入/删除。

我不确定这是否是一个好的答案,但它似乎有效

CREATE PROCEDURE ReservePropertyCodes
    @Count INT,
    @UserID INT
AS

DECLARE @i INT

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION

-- Locks the table
SELECT TOP 1 * FROM PropertyCode WITH (TABLOCK)

SET @i = 0
WHILE @i < @Count
BEGIN
    INSERT INTO PropertyCode (UserID) VALUES (@UserID)
    SET @i = @i + 1 
END
COMMIT TRANSACTION

我仍然可以根据表进行选择,但新插入将被锁定,直到存储过程完成。

我认为Chris的答案可以改进。当前它将选择并锁定整个表内容

如果您使用以下代码并假设您对代码有索引,那么它应该只使用一个范围锁,以防止其他事务在事务开始时添加代码大于最高代码的新记录,但不阻止对现有记录的并发更新

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
SELECT Code FROM PropertyCode WHERE Code > IDENT_CURRENT('PropertyCode')
INSERT INTO PropertyCode ..... 
COMMIT TRAN

那不行。由于事务在读提交事务隔离级别下运行,因此它仅在SELECT语句完成时锁定表。感谢帮助。我添加了行来设置隔离级别,现在似乎工作正常。我在发布后想到了这一点。我对它进行了测试,它仍然不允许对现有记录进行更新,我认为这很奇怪,没有时间进一步调查发生了什么,所以决定不编辑答案。@Chris-你确定它使用了索引吗?前几天我看了这个,发现有时候有必要添加一个索引提示,你在一个索引中得到了它,我出于懒惰在堆上创建了它,我添加了聚集索引,它确实允许更新。很高兴认识你,谢谢。