这非常简化,但是我有一个Web服务数组,看起来像这样:
[12345, 34131, 13431]
,我将遍历数组并将它们一个一个地插入数据库,我希望该表看起来像这样。这些值将与一个唯一的标识符绑定,表明它们是
1 12345
1 34131
1 13431
然后,如果出现另一个数组,它将插入其所有具有唯一ID 2的数字。基本上,这是为了跟踪组。
可能有多个进程同时执行此操作,那么生成唯一标识符并确保2个进程不能使用同一进程的最佳方法是什么?
答案 0 :(得分:2)
您应该修复数据模型。它缺少一个实体,例如batches
。
create table batches (
batch_id int identity(1, 1) primary key,
created_at datetime default getdate()
);
您可能还有其他信息。
您的表应具有外键引用,batch_id
至batches
。
然后您的代码应执行以下操作:
batches
中。新一批开始了。尽管您可以按顺序执行此操作,但对我来说,单独的表更有意义。您正在将一堆行捆绑到某物中。 某物应该在数据模型中表示。
答案 1 :(得分:1)
您可以声明以下内容: 宣告@UniqueID UNIQUEIDENTIFIER = NEWID();
并在插入批次时将其用作唯一标识符
答案 2 :(得分:0)
由于它不是主键,所以标识列不可用。老实说,我可能只是使用一个单独的ID序列表来对其进行跟踪。创建一个可获取下一个可用ID的proc,然后对其进行递增。如果您在proc的开头打开了一个事务,它应该防止第二个线程获取到该线程的更新,直到第一个线程完成更新为止。
类似的东西:
CREATE PROCEDURE getNextID
@NextNumber INT OUTPUT
,@id_type VARCHAR(20)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @NextValue TABLE (NextNumber int);
BEGIN TRANSACTION;
UPDATE id_sequence
SET last_used_number = ISNULL(@NextNumber, 0) + 1
OUTPUT inserted.last_used_number INTO @NextValue(NextNumber)
WHERE id_type = @id_type
SELECT @NextNumber = NextNumber FROM @NextValue
COMMIT TRANSACTION;
END