【问题标题】:Setting Serializable isolation level in stored procedure在存储过程中设置 Serializable 隔离级别
【发布时间】:2026-01-27 09:25:01
【问题描述】:

我有三个表和三个存储过程分别在这些表中插入/更新记录。第一个表有一个主键列 RecNo,它是自动生成的。

大约 1000 名用户同时从不同的地理位置在这些表中输入记录。我注意到有时即使插入成功完成并且没有生成警告,第二个或第三个表中的插入也会丢失。

我想知道自动生成的主键列如何处理并发问题。我是否需要在每个存储过程之上将隔离级别设置为 SERIALIZABLE?

我正在使用具有默认隔离级别的 SQL Server 2008 R2 Express,即 READ COMMITTED。

我的一个存储过程如下所示:

ALTER PROCEDURE [dbo].[pheSch_CreateOrUpdateTubewellDetails]
    -- Add the parameters for the stored procedure here
    @TwTaskFlag nvarchar(6),
    @TwParameterID bigint,
    @SerialNumber bigint,
    @TotalNum int,
    @TwType nvarchar(50),
    @Depth nvarchar(60),
    @Diameter nvarchar(60),
    @WaterCapacity nvarchar(60),
    @PS nvarchar(15),
    @PSNum int,
    @PSType nvarchar(60),
    @Remarks nvarchar(80)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
        BEGIN
            UPDATE tw_details
                SET 
                    TotalNum = @TotalNum,
                    TwType = @TwType,
                    Depth = @Depth,
                    Diameter = @Diameter,
                    WaterCapacity = @WaterCapacity,
                    PS = @PS,
                    PSNum = @PSNum,
                    PSType = @PSType,
                    Remarks = @Remarks
                WHERE twpid = @TwParameterID;
        END
END

【问题讨论】:

  • 你的问题提到了多个插入,但代码只显示了一个更新......

标签: sql-server sql-server-2008-r2


【解决方案1】:

您无需更改隔离级别, Identity 列非常适合并发插入。

如果

您没有任何触发器附加到表格 - 然后显示所有详细信息

但是

你注意到了插入 - 我在这里没有看到任何插入

【讨论】:

  • 我提交了部分代码。为什么在并发环境中缺少条目。
  • 您的自动生成的列 - 它是 IDENTITY、NEWID()、NEWSEQUENTIALID() 还是自定义的?
  • 那么没有任何错误的错过插入不会有任何问题
  • 告诉我 - 第一个插入之后的下一个插入 - 它们使用第一个插入的新自动生成的值?
  • 我在外键表中注意到了这个问题。