选择结合使用更新,竞赛条件



我想做这样的事情

begin trans
declare @maxpriceprice int;
Select @maxpriceprice MAX(price) from products where typeId = 5

及以后在

Insert into products (price) values(@maxpriceprice + RAND() * 10)
commit tran

这很奇怪,但这是奇怪的应用。

在选择和插入物之间,我负担不起将东西插入thedatabase的人。

可以使用(xlock)进行选择的最高价格,以防止其他人获得最大价格,直到我完成交易。

如果让DBMS为您处理锁定,则在数据库中永远不会有种族条件。为此,您必须提供足够的信息:

insert into products (price) 
select MAX(price) + RAND() * 10 
from products where typeId = 5

可以使用(xlock)

进行选择的最高价格

基本上,没有。您永远不想将交易打开,并将手部控制回到应用程序或用户。您想连续将鸭子放入并执行交易。如果您想"锁定"某些东西(例如,用户更新信息),通常您会诉诸于乐观的并发策略策略,在更新时,您会验证该行没有更改,因为它是读。您可能需要在timestamp数据类型上阅读,该数据类型支持该样式。

SQL还定义了光标,行级锁定和可序列化的隔离。这些都在SQL Server中也可用,这是一定代价的并发。

最新更新