Sql 选择与更新、竞争条件组合
我想做这样的事情Sql 选择与更新、竞争条件组合,sql,sql-server,database-design,Sql,Sql Server,Database Design,我想做这样的事情 begin trans declare @maxpriceprice int; Select @maxpriceprice MAX(price) from products where typeId = 5 后来 Insert into products (price) values(@maxpriceprice + RAND() * 10) commit tran 这很奇怪,但这是一个奇怪的应用 在select和insert之间,我不能让人们将内容插入数据库 在我完成
begin trans
declare @maxpriceprice int;
Select @maxpriceprice MAX(price) from products where typeId = 5
后来
Insert into products (price) values(@maxpriceprice + RAND() * 10)
commit tran
这很奇怪,但这是一个奇怪的应用
在select和insert之间,我不能让人们将内容插入数据库
在我完成交易之前,是否可以使用(XLOCK)选择最高价格以防止其他人获得最高价格。如果让DBMS为您处理锁定,则数据库中永远不会有竞争条件。为此,您必须提供足够的信息:
insert into products (price)
select MAX(price) + RAND() * 10
from products where typeId = 5
是否可以使用(XLOCK)选择最高价格
基本上,不会。您永远不希望让事务保持打开状态,并将控制权交还给应用程序或用户。你想把你的鸭子排成一行,然后执行你的交易。如果您想“锁定”某些内容(比如说,用户更新信息),您通常会采用乐观并发策略,在更新时,您可以验证行自被读取以来没有发生更改。您可能需要阅读支持该样式的时间戳
数据类型
SQL还定义了游标、行级锁定和可序列化隔离。这些都在SQL server中可用,但并发性会有所降低 如果让DBMS为您处理锁定,则数据库中永远不会有竞争条件。为此,您必须提供足够的信息:
insert into products (price)
select MAX(price) + RAND() * 10
from products where typeId = 5
是否可以使用(XLOCK)选择最高价格
基本上,不会。您永远不希望让事务保持打开状态,并将控制权交还给应用程序或用户。你想把你的鸭子排成一行,然后执行你的交易。如果您想“锁定”某些内容(比如说,用户更新信息),您通常会采用乐观并发策略,在更新时,您可以验证行自被读取以来没有发生更改。您可能需要阅读支持该样式的时间戳
数据类型
SQL还定义了游标、行级锁定和可序列化隔离。这些都在SQL server中可用,但并发性会有所降低 在
MSDN
中,它提到XLOCK
指定在事务完成之前获取并保持独占锁。S0在MSDN
中,它应该按照预期工作从带有(xLOCK)的产品中选择@maxpriceprice=MAX(price),其中typeId=5
,它提到xLOCK
指定在事务完成之前获取并保持独占锁。S0它应该按预期工作从带有(xLOCK)的产品中选择@maxpriceprice=MAX(price),其中typeId=5