В настоящее время я занимаюсь разработкой системы онлайн-аукциона с использованием ASP.NET 3.5 и SQLServer 2008. Я достиг стадии разработки, когда мне нужно убедиться, что моя система разумно обрабатывает проблему параллелизма, которая может возникнуть, когда:
Два человека - Джеральдин и Джон - хотят сделать ставку на один и тот же предмет аукциона, который сейчас стоит 50 фунтов.Джеральдина вводит ставку в 55 фунтов стерлингов, а Джон вводит ставку в 52 фунта.Теперь в системе работает две копии страницы submit_bid.aspx;каждая копия страницы проверяет, достаточно ли высока их ставка, они оба видят, что это так, и подают заявки.Если ставка Джона проходит сначала, то цена предмета аукциона в настоящее время составляет 55 фунтов стерлингов, а мгновение спустя она заменяется ставкой 52 фунтов стерлингов.
Что мне нужно сделать, это заблокировать строку предмета аукциона до текущейцена предложения обновляется, прежде чем позволить любому другому участнику проверить текущую цену предложения и сделать новую ставку.
Мой вопрос: каков наилучший способ сделать это с использованием T-SQL и / или ADO.NET??
В настоящее время у меня есть таблица AuctionItem, которая имеет следующие поля (плюс другие поля, которые я не включил для краткости):
AuctionItemID INT
CurrentBidPrice MONEY
CurrentBidderID INT
Я провел некоторые исследования и придумалиследующий T-SQL (псевдокод-ish):
@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 миллисекунд для снятия блокировки.Это лучшая практика?