在存储过程中设置Serializable隔离级别

时间:2011-12-29 09:03:02

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

我分别有三个表和三个存储过程来插入/更新这些表中的记录。第一个表有一个主键列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

1 个答案:

答案 0 :(得分:0)

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

如果

你没有附加任何触发器 - 然后显示所有细节

<强> BUT

你注意到了INSERTS - 我在这里看不到任何一个