- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 ASP.NET 3.5 和 SQLServer 2008 开发在线拍卖系统。我已经达到了开发阶段,我需要确保我的系统明智地处理在以下情况下可能出现的并发问题:
杰拉尔丁 (Geraldine) 和约翰 (John) 两个人想要竞拍同一件拍卖品,目前售价为 50 英镑。杰拉尔丁 (Geraldine) 的出价为 55 英镑,约翰 (John) 的出价为 52 英镑。系统现在有两个页面“submit_bid.aspx”正在运行;该页面的每个副本都会检查其出价是否足够高,他们都看到了这一点,然后提交了出价。如果约翰的出价首先通过,那么拍卖元素的价格当前为 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 毫秒以释放锁。这是最佳实践吗?
最佳答案
来源:“chrisrlong”,http://www.dbasupport.com/forums/archive/index.php/t-7282.html
以下是用于处理多用户并发问题的方法:
什么都不做(不需要)
用户 2 现在已覆盖用户 1 所做的更改。它们完全消失了,就好像它们从未发生过一样。这称为“丢失更新”。
悲观锁定(在读取记录时锁定记录。)
丢失更新的问题已解决。这种方法的问题是并发性。用户 1 正在锁定他们可能永远不会更新的记录。用户 2 甚至无法读取该记录,因为他们在读取时也需要独占锁。这种方法需要太多的独占锁定,并且锁的生命周期太长(通常跨越用户控制 - 绝对不能)。这种方法几乎从未被实现。
使用乐观锁定。
乐观锁在读取时不使用排它锁。相反,在更新期间会进行检查,以确保记录自读取以来没有被更改。通常,这是通过添加 version/etc 列(INT/numeric,保存在执行 UPDATE 语句时增加的数值)来完成的。 IE:
UPDATE YOUR_TABLE
SET bid = 52
WHERE id = 10
AND version = 6
另一种选择是使用时间戳,而不是数字列。除了实现乐观并发之外,此列没有其他目的。它可以是数字或日期。这个想法是在插入行时为其赋予一个值。每当读取记录时,时间戳列也会被读取。执行更新时,将检查时间戳列。如果更新时的值与读取时的值相同,则一切正常,执行更新并且时间戳发生更改!。如果更新时的时间戳值不同,则会向用户返回错误 - 他们必须重新读取记录,重新进行更改,并尝试再次更新记录。
关于sql - T-SQL并发问题: Auction/Bidding System,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573192/
我正在为这个 MySQL 语句苦苦挣扎,希望有人能帮助我。 我有包含以下数据的下表。 Jobs | Bids | --------|-------------| JobID |
我已经完成了一个业余项目,一家公司希望我开发一个数据库/智能客户端来跟踪其各种计划的参与者。该应用程序将使用 C# 和 MS SQL Server 编写。 我想知道是否有关于如何实际投标该工作的任何提
我已在我的计算机上成功安装了 BIDS 2008。我卸载了它,现在需要重新安装它。 进行设置时,Business Intelligence Development Studio 在“功能选择”屏幕中显
我想通过使用商业智能开发工作室创建sql server集成服务包,但不知道为什么这个studio没有从sql server组打开,只有命令窗口打开突然关闭,是否安装了BIDS如何要检查它,请帮我做同样
我开始使用 Microsoft BI 套件:Analysis services 2005、Business Intelligence Development Studio 2005,诸如此类。当然,我
我有一个客户维度。创建多维数据集并定义维度时,默认属性将随多维数据集创建一起出现。我想在创建尺寸后添加更多属性。这个怎么做。我尝试使用“添加商业智能”选项,但失败了。有什么办法可以这样做吗?如果我们删
这是一个很奇怪的问题。在 BIDS/Visual Studio 中,“开始调试”按钮不会运行我正在处理的事件包。相反,它会在项目中打开另一个包(总是同一个包)并运行那个包。我只能通过在解决方案资源管理
对于那些不熟悉它的人来说,实时竞价广告交换是一种相对较新的方式,它允许广告商“竞标”以获得向个人展示其广告的权利。 它的工作原理是这样的:用户点击一个包含广告空间的网站。该网站然后 ping 广告交换
我有一个简单的网站,用户可以在其中对产品出价。该模型如下所示: 显然不同的用户可以出价,那么我如何绘制丢失的链接到“用户”表? 我有点困惑是使用识别关系还是非识别关系。更新: 最佳答案 你说:“...
简单的问题 - 有没有办法将默认的 NullProcessing 设置从自动更改为保留? 当您在某些行中使用 NULL 值的度量时,由于默认的 NULLProcessing 设置,这些 NULL 值默
尽管我的头衔说明了我目前的目标,但我对其他解决方案持开放态度。简而言之,我有一系列 SSIS 包,它们计划在我们的 SQL Server 机器上每晚运行。 由于我的公司 IT 中发生的各种更新,有时这
我正在尝试使用事件处理程序在SSIS包中记录错误。不幸的是,没有选择将事件处理程序添加到数据流任务中的各个任务上的选项。因此,我在控制流级别向整个数据流任务添加了一个事件处理程序。 当数据流任务中发生
我目前正在使用 ASP.NET 3.5 和 SQLServer 2008 开发在线拍卖系统。我已经达到了开发阶段,我需要确保我的系统明智地处理在以下情况下可能出现的并发问题: 杰拉尔丁 (Gerald
无论如何,是否可以对报表管理器进行更多控制,对于这样一个复杂的产品来说,除了重命名文件夹并将报表和报表部件放置在这些文件夹中之外,几乎无法控制报表管理器部分,这似乎很奇怪我知道我什至无法移动它们并以任
参见 (image.1) - 正如您所看到的,在设计 View 中,我的左侧有两个表格,右侧有两个饼图,所有这些都整齐地放置。 参见(image.2) - 现在我预览报告,正如您所看到的,我不允许在表
我在为在商业智能开发工作室 (BIDS) 中创建的 SSRS 报告执行存储过程时遇到了超时问题。我的存储过程非常大,在 SQL Server Management Studio 中执行平均需要近 4
我尝试在 Doubleclick Bid Manager 中创建新查询,但得到的只是“500 内部服务器错误”( https://developers.google.com/bid-manager/v
我有一个小型投标系统,用于幻想拍卖草案。我正在尝试使用以下查询来提高每个玩家的最高出价。但是,它实际上并没有给我最高出价,它只是给我第一个输入数据库的出价。 SELECT Bid.id FROM bi
我正在编写我的第一个 Google APIs Winforms 应用程序,但我不知道如何进行 API 调用。 此 google“入门”中的示例 documentation帮助不大。 我有一个客户端 I
SQL Server 2008 - 标准版(64 位)是否支持 Business Intelligence Development Studio (BIDS)?如果是,请告诉我怎么做。 SQL Ser
我是一名优秀的程序员,十分优秀!