拍卖行竞拍存储过程,存在什么问题呢?

------------------------------------------------------

--Copyright (c) 1.0

--Author     :保密

--Date       :2010-3-17 16:39:58

--Description:拍卖行的竞标

--游戏里的拍卖行竞拍存储过程,玩家反映一口价竞拍物品,点券扣了,但物品没有收到,目前拍卖行总交易10万多次,

--这种情况出现了11次。大概是什么问题呢?目前多次测试没能重现,有没有牛人能目测出问题在哪儿?==========================================================================================

--业务逻辑如下(所有的扣点加点,调用外部的存储过程,返回接口和调用方法也不一致,汗):

--IF 点券交易

--BEGIN

--  IF 一口价  

--  BEGIN

--     1.发送给买家物品(发送到买家临时背包)

--     2.如果这个东西之前有另外的玩家竞价过,需要退还上一个玩家的点券

--     3.保存交易日志

--     4.删除拍卖行的物品,删除这条拍卖纪录

--     5.扣买家的点券

--     6.给卖家点券

--  END

--  ELSE 不是一口价,竞价

--  BEGIN     

--     1.退回上一个竞价者的点券

--     2.扣本次竞价者的点券

--  END

--END

--ELSE 游戏币交易

--BEGIN

--  1.退回上一个竞价者的游戏币

--  2.扣本次竞价者的游戏币

--END

--===========================================================================================

-- Return value:

--     0:执行成功

-- 特别说明,由于代码生成器问题,返回值只接收SELECT值,不接收直接RETURN的值,呃~~~不能改变别人就改变自己吧

------------------------------------------------------

ALTER PROCEDURE [dbo].[P_HBAuctionHouse_BidUp]

    @Idx BIGINT, -- 标识 

    @BuyerId varchar(50) ,-- 购买者Id,没有购买者的时候就是空的,有就是购买者的GUID

    @BuyerName varchar(50),--购买者名字

    @BuyPrice int -- 购买价  

AS

BEGIN

    SET XACT_ABORT ON

    BEGIN TRAN BIDUPTRAN

       DECLARE @BuyerUid UNIQUEIDENTIFIER--用户Id,外部传的字符串类型,需要转换成UNIQUEIDENTIFIER

       DECLARE @BidCount INT--竞标次数

       DECLARE @SellerId UNIQUEIDENTIFIER--卖家id

       DECLARE @SellerName VARCHAR(50)--卖家名称

       DECLARE @BeforeBuyerId VARCHAR(50)--上次的竞价者id

       DECLARE @BeforeBuyerName VARCHAR(50) --上次的竞价者NAME

       DECLARE @M INT--上次的购买价

       DECLARE @EndPrice INT--一口价   

       DECLARE @CurrencyType INT --点券还是游戏币     

       DECLARE @Result INT--点券增减返回值

       DECLARE @SRCID VARCHAR(50)--交易号,负的交易ID

       DECLARE @BeforePass9Name varchar(100)--之前买家的C通行证名

       DECLARE @BuyerPass9Name varchar(100)--当前买家的C通行证名

       DECLARE @TBLPAY TABLE(CODE VARCHAR(20))--交易表  

       DECLARE @NOW DATETIME--当前服务器时间

       SET @NOW = GETDATE()    

      

       SET @BidCount = -1--竞标次数

       IF @BuyerId <> ''

           SET @BuyerUid = CAST(@BuyerId AS UNIQUEIDENTIFIER)

       ELSE

           SET @BuyerUid = '00000000-0000-0000-0000-000000000000'

 

       SET @M = 0

   

    BEGIN   TRY

      

       --有无该条记录

       IF NOT EXISTS ( SELECT * FROM  [HB_AuctionHouse] WITH(NOLOCK) WHERE Idx = @Idx  )

       BEGIN

           IF @@TRANCOUNT > 0 ROLLBACK

           SELECT 6400  

           RETURN;      

       END

      

       --获取相关数据

       SELECT @IDX = IDX, @SellerId=SellerId ,@SellerName=SellerName,    @BeforeBuyerId=BuyerId,@BeforeBuyerName=BuyerName, @M=BuyPrice,@EndPrice=SellEndPrice, @BidCount =BidCount,@CurrencyType = CurrencyType

       FROM  [HB_AuctionHouse] WITH(XLOCK) WHERE Idx = @Idx

       IF @M > @BuyPrice

       BEGIN

           IF @@TRANCOUNT > 0 ROLLBACK

           SELECT 6407  

           RETURN;

       END

       IF @SellerId = @BuyerUid

       BEGIN

           IF @@TRANCOUNT > 0 ROLLBACK

           SELECT 6401      

           RETURN;   

       END

       --交易号

       SET @SRCID = CAST( @Idx * -1 AS VARCHAR(18)) + '_' + CAST( @BidCount AS VARCHAR(5))

 

       --允许用户竞标后,再一口价

       IF @BeforeBuyerId = @BuyerId AND @EndPrice <> @BuyPrice

       BEGIN

           IF @@TRANCOUNT > 0 ROLLBACK

           SELECT 6402      

           RETURN;   

       END

       IF @CurrencyType = 2--点券

       BEGIN

           IF @EndPrice = @BuyPrice--如果竞标价等于一口价,那就直接拍定

           BEGIN

              INSERT INTO [HB_TempPackage]--加入临时背包

                     ([ManagerId]

                     ,[ItemId]

                     ,[ItemStrengthLevel]

                     ,[ItemCode]

                     ,[ItemName]

                     ,[Count]

                     ,[ItemType]

                     ,[ImageId]

                     ,[Memo]

                     ,[Status]

                     ,[Rowtime]

                     ,[Increment])

              SELECT @BuyerId

                     ,ItemId

                     ,ItemStrengthLevel

                     ,ItemCode

                     ,ItemName

                     ,[Count]

                     ,[ItemType]

                     ,[ImageId]

                     ,'卖家:'+SellerName+',花费'+CAST(@BuyPrice AS VARCHAR(10))+'G'

                     ,0

                     ,GETDATE(),Increment FROM [HB_AuctionHouse] WHERE Idx = @Idx

             

              --退回上一个竞价者的钱$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$            

               IF @BidCount > 0

              BEGIN

                  --获取上一个买家的Pass9Name

--                DECLARE @BeforePass9Name varchar(100)

                  SELECT @BeforePass9Name = Pass9Name FROM dbo.HB_User U

                  INNER JOIN HB_MANAGER M ON U.UserGuid = M.UserId

                  WHERE M.ManagerGuid = @BeforeBuyerId

                  DECLARE @B VARCHAR(50)

                  SET @B = @SRCID+'_B'

                  EXEC P_HbPayAccount_Pay @BeforePass9Name,-1,@B,0,0,@M,@Result

                  IF @Result <> 5200

                  BEGIN                      

                     IF @@TRANCOUNT > 0 ROLLBACK

                     SELECT 6402  

                     RETURN;

                  END

              END

             

             

    --------------给上一个竞价者发一个邮件,通知竞标失败

    --------------通知卖家已经拍卖成功

              --保存交易日志

              INSERT INTO [HB_AuctionHouse_LOG]

              SELECT [Idx] ,    [ItemName] ,  [ItemStrengthLevel] ,

              [ItemId] , [ItemCode] ,  [ItemLevel],  [Count] ,  [ItemType] ,

              [ImageId] ,   [SellerId] ,  [SellerName], @BuyerId , @BuyerName ,

              [SellStartPrice] ,   [SellEndPrice],   [BuyPrice] ,

              [BidCount] ,[CurrencyType] ,[Increment] FROM [HB_AuctionHouse] WHERE Idx = @Idx

 

              --删除拍卖行的物品,删除这条拍卖纪录

              DELETE [HB_AuctionHouse] WHERE Idx = @Idx           

             

              --获取Pass9Name

              SELECT @BuyerPass9Name = Pass9Name FROM dbo.HB_User U (NOLOCK)

              INNER JOIN HB_MANAGER M  (NOLOCK) ON U.UserGuid = M.UserId

              WHERE M.ManagerGuid = @BuyerUid   

 

              --扣买家的点券

              DECLARE @N VARCHAR(50)

              SET @N = @SRCID+'_N'

               INSERT @TBLPAY

              EXEC P_HBPAYACCOUNT_CONSUMEPOINT @BuyerPass9Name,@N,@BuyPrice,@NOW

              IF NOT EXISTS(SELECT 1 FROM @TBLPAY WHERE CODE='5200')

              BEGIN

                  IF @@TRANCOUNT > 0 ROLLBACK

                  SELECT 6402  

                  RETURN;

              END              

 

              --给卖家点券$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

              --获取Pass9Name

              DECLARE @SellerPass9Name varchar(100)

              SELECT @SellerPass9Name = Pass9Name FROM dbo.HB_User U

              INNER JOIN HB_MANAGER M ON U.UserGuid = M.UserId

              WHERE M.ManagerGuid = @SellerId              

              DECLARE @S VARCHAR(50)

              SET @S = @SRCID+'_S'

              EXEC P_HbPayAccount_Pay @SellerPass9Name,-1,@S,0,0,@BuyPrice,@Result

              --PRINT @Result

              IF @Result <> 5200

              BEGIN                      

                  IF @@TRANCOUNT > 0 ROLLBACK

                  SELECT 6402  

                  RETURN;

              END   

 

           END

           ELSE---不是一口价

           BEGIN

              IF @BidCount = 0--是否是第一次竞拍

              BEGIN

                  IF @BuyPrice = @M

                  BEGIN     

                         --PRINT 2        

                         UPDATE [dbo].[HB_AuctionHouse] SET

                            [BuyerId] = @BuyerId,

                            BuyerName = @BuyerName,

                            [BuyPrice] = @BuyPrice,

                            [LimitTime] = DATEADD(n,5,[LimitTime]) ,

                            BidCount = BidCount + 1

                         WHERE

                            [Idx] = @Idx 

                         --PRINT 3           

                  END

                  ELSE

                  BEGIN

                         IF @@TRANCOUNT > 0 ROLLBACK

                         SELECT 6406

                         RETURN;

                  END

              END

              ELSE IF @BidCount > 0 --不是第一次竞拍

              BEGIN

                  IF @BuyPrice > @M

                  BEGIN            

                     --退回上一个竞价者的钱$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

                     --获取上一个买家的Pass9Name

                    

                     SELECT @BeforePass9Name = Pass9Name FROM dbo.HB_User U

                     INNER JOIN HB_MANAGER M ON U.UserGuid = M.UserId

                     WHERE M.ManagerGuid = @BeforeBuyerId

                    

                     EXEC P_HbPayAccount_Pay @BeforePass9Name,-1,@SRCID,0,0,@M,@Result

                     IF @Result <> 5200

                     BEGIN                      

                         IF @@TRANCOUNT > 0 ROLLBACK

                         SELECT 6402  

                         RETURN;

                     END          

    --------------------给上一个竞价者发一个邮件,通知竞标失败

                        

                     --扣本次竞价者的钱放到后面  

                     UPDATE [dbo].[HB_AuctionHouse] SET

                         [BuyerId] = @BuyerId,

                         BuyerName = @BuyerName,

                         [BuyPrice] = @BuyPrice,

                         [LimitTime] = DATEADD(n,5,[LimitTime]) ,

                         BidCount = BidCount + 1

                     WHERE

                         [Idx] = @Idx AND BuyPrice < @BuyPrice

                  END

                  ELSE

                  BEGIN               

                     IF @@TRANCOUNT > 0 ROLLBACK

                     SELECT 6407

                     RETURN;

                  END

              END

              --对玩家游戏币验证,扣买家的点券$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

              --

              SELECT @BuyerPass9Name = Pass9Name FROM dbo.HB_User U

              INNER JOIN HB_MANAGER M ON U.UserGuid = M.UserId

              WHERE M.ManagerGuid = @BuyerUid   

 

                        

             

              INSERT @TBLPAY

              EXEC P_HBPAYACCOUNT_CONSUMEPOINT @BuyerPass9Name,@SRCID,@BuyPrice,@NOW

              IF NOT EXISTS(SELECT 1 FROM @TBLPAY WHERE CODE='5200')

              BEGIN

                  IF @@TRANCOUNT > 0 ROLLBACK

                  SELECT 6402  

                  RETURN;

              END              

           END   

       END

       ELSE--游戏币

       BEGIN

           IF @BidCount = 0--是否是第一次竞拍

           BEGIN

              IF @BuyPrice = @M

              BEGIN     

                     --PRINT 2        

                     UPDATE [dbo].[HB_AuctionHouse] SET

                         [BuyerId] = @BuyerId,

                         BuyerName = @BuyerName,

                         [BuyPrice] = @BuyPrice,

                         [LimitTime] = DATEADD(n,5,[LimitTime]) ,

                         BidCount = BidCount + 1

                     WHERE  [Idx] = @Idx 

                     --PRINT 3           

              END

              ELSE

              BEGIN

                     IF @@TRANCOUNT > 0 ROLLBACK

                     SELECT 6406  

                     RETURN;                 

              END

           END

           ELSE IF @BidCount > 0 --不是第一次竞拍

           BEGIN

              IF @BuyPrice > @M

              BEGIN            

                  --退回上一个竞价者的钱

                  UPDATE HB_ManagerProperty SET  

                     [Money] = [Money] + @M

                  WHERE ManagerId = CAST(@BeforeBuyerId AS UNIQUEIDENTIFIER)

--------------------给上一个竞价者发一个邮件,通知竞标失败

                    

                  --扣本次竞价者的钱放到后面  

                  UPDATE [dbo].[HB_AuctionHouse] SET

                     [BuyerId] = @BuyerId,

                     BuyerName = @BuyerName,

                     [BuyPrice] = @BuyPrice,

                     [LimitTime] = DATEADD(n,5,[LimitTime]) ,

                     BidCount = BidCount + 1

                  WHERE

                     [Idx] = @Idx AND BuyPrice < @BuyPrice

              END

              ELSE

              BEGIN               

                  IF @@TRANCOUNT > 0 ROLLBACK

                  SELECT 6407

                  RETURN;

              END

           END

           --对玩家游戏币验证

            IF EXISTS (SELECT * FROM HB_ManagerProperty WHERE ManagerId = @BuyerUid AND [Money] >= @BuyPrice)

            BEGIN

               UPDATE  HB_ManagerProperty

               SET [Money] = [Money] - @BuyPrice

               WHERE ManagerId = @BuyerUid

             

            END

            ELSE--没有足够的游戏币

            BEGIN

              IF @@TRANCOUNT > 0 ROLLBACK

              SELECT 6408

              RETURN;

            END

       END   

      

    END   TRY

    BEGIN CATCH

       IF @@TRANCOUNT > 0 ROLLBACK TRAN      

    END CATCH

    IF @@TRANCOUNT > 0

    COMMIT TRAN BIDUPTRAN

   

END

SELECT 0

RETURN 0

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值