【问题标题】:Stored Procedure Serialization Problem存储过程序列化问题
【发布时间】:2009-01-20 12:45:41
【问题描述】:

以下存储过程代码对于多用户应用程序是否健壮。它工作正常。我想知道是否有更好的方法可以做到这一点,是否有任何性能问题。

proc 有三个 sql 语句,如 1.更新分配表中的硬件状态 2.计算要插入到 DEFECT_LOG 表中的新记录的下一个适当的主键值 3.将值插入到 DEFECT_LOG 表中。如果交易成功,我也使用变量返回 1。

ALTER PROCEDURE spCreateDefective

(

    @alloc_ID nvarchar(50),
    @cur_date datetime,
    @problem_desc nvarchar(MAX),
    @got_defect_date datetime,
    @trans_status tinyint OUTPUT --Used to check transaction status
)

AS

/*  Transaction Maintainer Statements   */

BEGIN TRAN transac1

    SET XACT_ABORT ON

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

/*  Declaration Area    */

    DECLARE @temp nvarchar(10)

    DECLARE @def_ID nvarchar(20)

/*  Updating Inventory Status to 'Defective' and Updating Release Date to current System date   */  

    UPDATE INV_Allocation_DB

    SET INV_STATUS = 'Defective' , RELEASE_DATE=@cur_date
    WHERE INV_ID=@alloc_ID


/*  Calculates New Primary Key for the DEFECT_LOG Table */

--  Returns the largest number or 1 if no records are present in the table  

    SELECT @temp=COALESCE(CONVERT(int,SUBSTRING(MAX(DEFECT_ID),5,5))+1,1) FROM DEFECT_LOG


    SET @def_ID = 'DEF_'+ RIGHT(replicate('0',5)+ convert(varchar(5),@temp),5)

/*  Insert statement for inserting data into DEFECT_LOG */

    INSERT INTO DEFECT_LOG (DEFECT_ID,INV_ID,PROB_DESC,GOT_DEFECT_DATE) 
    VALUES(@def_ID,@alloc_ID,@problem_desc,@got_defect_date)


    SET @trans_status = 1

    COMMIT TRAN transac1

/*  Returns 1 if transaction successful */

RETURN @trans_status

【问题讨论】:

    标签: sql-server visual-studio sql-server-2005 stored-procedures


    【解决方案1】:

    不建议使用 SERIALIZABLE 事务级别,除非您绝对必须拥有一个。它会增加阻塞的可能性并降低吞吐量。

    您似乎在使用它来保证唯一的 DEFECT_ID?为什么不对 DEFECT_ID 使用 IDENTITY 列呢?

    【讨论】:

      【解决方案2】:

      就我个人而言,我会使用 IDENTITY 字段作为真正的主键,但随后会有一个带有字母数字标识符的附加列。 (可能作为持久化计算字段)

      这应该会减少并发问题的数量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        相关资源
        最近更新 更多