我想做这样的事情
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中也可用,这是一定代价的并发。