Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
MSSQL竞赛条件_Sql_Sql Server_Stored Procedures_Race Condition - Fatal编程技术网

MSSQL竞赛条件

MSSQL竞赛条件,sql,sql-server,stored-procedures,race-condition,Sql,Sql Server,Stored Procedures,Race Condition,此SQL存储过程是否会遇到竞争条件问题 ALTER PROCEDURE [dbo].[basket_add] @item_no BIGINT, @child_item_no BIGINT, @order_no NVARCHAR(50), @qty SMALLINT, @curr_code NVARCHAR(3), @store_id TINYINT AS BEGIN SET NOCOUNT ON; BEGIN TRY

此SQL存储过程是否会遇到竞争条件问题

ALTER PROCEDURE [dbo].[basket_add]
    @item_no BIGINT,
    @child_item_no BIGINT,
    @order_no NVARCHAR(50),
    @qty SMALLINT,
    @curr_code NVARCHAR(3),
    @store_id TINYINT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        DECLARE @price_gbp DECIMAL(18,2), @price_curr DECIMAL(18,2);
        DECLARE @rtn_tbl_basket TABLE (id bigint);
        IF @qty > 0 
        BEGIN
            --Call product price function to get latest product price
            SELECT  @price_gbp  = gbp_price 
                   ,@price_curr = curr_price
            FROM product_price(@item_no,@child_item_no,@curr_code,@store_id) WHERE curr_code = @curr_code;

            --Ensure price exists for specified product
            DECLARE @errormsg NVARCHAR(100) = 'Errors found, product/price does not exist: ' + CAST(@item_no AS NVARCHAR(10)) + '-' + CAST(@child_item_no AS NVARCHAR(10));
            IF ISNULL(@price_gbp,0) = 0 RAISERROR (@errormsg, 16, 2) WITH SETERROR; 

            INSERT INTO basket(order_no, item_no,child_item_no, qty, price, curr_price, curr_code)
            OUTPUT inserted.id INTO @rtn_tbl_basket(id)
            VALUES (@order_no,@item_no,@child_item_no,@qty,@price_gbp, @price_curr, @curr_code)

            --return success
            SELECT id AS rtn_basket_id ,1 AS success FROM @rtn_tbl_basket 
        END
    END TRY
    BEGIN CATCH 
    SELECT 
            --return failure
            (SELECT id FROM @rtn_tbl_basket) as rtn_basket_id, 
            0 AS success, 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_LINE() AS ErrorLine,
            ERROR_MESSAGE() AS ErrorMessage; 
    END CATCH
END

你能更具体地回答你的问题吗?解释你的代码在做什么,以及你认为问题出在哪里,否则你希望用户在回答你的问题之前消化并理解你的SQL。我知道竞争问题通常会发生在胜利者身上,但是我想知道在上面的SQL中是否有可能在函数返回价格之前插入到篮子中?或者调用此代码的其他进程可能会出现问题?您是指可能有多个进程运行此过程的情况吗?SQL语句是按顺序运行的,因此,如果您在插入之前询问最新价格,则不可能出现竞争条件。感谢Tanner,Elliveny yes此代码将由多个进程调用