T-SQL并发问题:拍卖/竞标系统
我目前正在使用ASP.NET 3.5和SQLServer 2008开发在线拍卖系统.我已经达到了开发的地步,我需要确保我的系统能够合理地处理在以下情况下可能出现的并发问题:
两个人 – 杰拉尔丁和约翰 – 想要竞标目前价格为50英镑的拍卖品. Geraldine以55英镑的价格出价,约翰出价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以下是用于处理多用户并发问题的方法: >什么都不做(不受欢迎) >用户1读取记录 用户2现在已经覆盖了用户1所做的更改.它们完全消失了,好像它们从未发生过一样.这称为“丢失更新”. >用户1读取记录并通过在记录上放置一个独占锁来锁定它(FOR UPDATE子句) 丢失的更新问题已解决.这种方法的问题是并发性.用户1正在锁定他们可能永远不会更新的记录.用户2甚至无法读取记录,因为他们在阅读时也想要独占锁定.这种方法需要太多的独占锁定,并且锁的使用时间太长(通常跨越用户控制 – 绝对禁止).这种方法几乎从未实现过. UPDATE YOUR_TABLE SET bid = 52 WHERE id = 10 AND version = 6 另一种选择是使用时间戳,而不是数字列.除了实现乐观并发之外,此列仅用于其他目的.它可以是数字或日期.想法是在插入行时给出一个值.每当读取记录时,也会读取timestamp列.执行更新时,将检查时间戳列.如果它在UPDATE时具有与读取时相同的值,则一切正常,执行UPDATE并更改时间戳!如果时间戳值在UPDATE时间不同,则会向用户返回错误 – 他们必须重新读取记录,重新进行更改,并尝试再次更新记录. >用户1读取记录,包括21的时间戳 对照 >乐观锁定与数据库无关 – 无需隔离级别和隔离级别的数据库特定语法.>我在时间戳上使用数字列 – 更少的数据&麻烦管理 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql – 批量插入Oracle数据库:哪个更好:FOR Cursor循环还
- tsql – T-SQL“timestamp”覆盖“rowversion”数据类型列
- Sql Server 数据库索引整理语句,自动整理数据库索引
- 存储过程里 行锁 表锁 sqlserver or oracle
- sql2005 本地计算机上的SQL SERVER服务启动后又停止了解决方
- SQL SERVER 利用存储过程查看角色和用户信息的写法
- Mysql启动报ERROR:2002的分析与解决
- SQL2000 全文索引完全图解
- sql-server – ETL SSIS:将错误行重定向到单独的表
- SQLServer Broker Service 配置步骤