Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择与更新、竞争条件组合_Sql_Sql Server_Database Design - Fatal编程技术网

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