【发布时间】:2011-07-04 15:06:59
【问题描述】:
我目前正在使用 ASP.NET 3.5 和 SQLServer 2008 开发一个在线拍卖系统。我已经到了开发阶段,我需要确保我的系统能够明智地处理以下情况下可能出现的并发问题:
两个人 - Geraldine 和 John - 想要为同一个拍卖品出价,目前售价为 50 英镑。杰拉尔丁出价 55 英镑,约翰出价 52 英镑。系统现在有两个页面“submit_bid.aspx”正在运行;页面的每个副本都会检查他们的出价是否足够高,他们都看到了,然后他们提交了出价。如果 John 的出价先通过,那么拍卖品的当前价格为 55 英镑,稍后会被 52 英镑的出价取代。
我需要做的是锁定拍卖品行,直到当前出价被更新,然后才允许任何其他出价者检查当前出价并提出新的出价。
我的问题是:使用 T-SQL 和/或 ADO.NET 执行此操作的最佳做法是什么?
我目前有一个 AuctionItem 表,其中包含以下字段(以及为简洁起见未包括的其他字段):
AuctionItemID INT
CurrentBidPrice MONEY
CurrentBidderID INT
我进行了一些研究并提出了以下 T-SQL(伪代码):
@Bid MONEY
@AuctionItemID INT
BEGIN TRANSACTION
SELECT @CurrentBidPrice = CurrentBidPrice
FROM AuctionItem
WITH (HOLDLOCK, ROWLOCK)
WHERE AuctionItemID = @AuctionItemID
/* Do checking for end of Auction, etc. */
if (@Bid > @CurrentBidPrice)
BEGIN
UPDATE AuctionItem
SET CurrentBidPrice = @Bid
WHERE AuctionItemID = @AuctionItemID
END
COMMIT TRANSACTION
我还读到如果我包含SET LOCK_TIMEOUT,我还可以减少失败的并发更新的数量。例如:
SET LOCK_TIMEOUT 1000
...将使并发更新等待 1000 毫秒以释放锁。这是最佳做法吗?
【问题讨论】:
-
或者记录“出价历史”,记录出价+金额,然后您可以查询最大(出价)并检查其是否为当前用户
-
另一个问题,您真的希望用户在网站上不断地敲击网站以查看是否有最高出价,然后将他们的出价提高 1 美元吗?这就是为什么 ebay 让您输入您愿意支付的最高金额并为您增加金额。
-
你应该选择一个答案。 41% 太低了。也请检查您的其他问题。
标签: sql sql-server tsql sql-server-2008 concurrency