Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/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_Stored Procedures_Locking_Sql Update - Fatal编程技术网

同步更新SQL表

同步更新SQL表,sql,sql-server,stored-procedures,locking,sql-update,Sql,Sql Server,Stored Procedures,Locking,Sql Update,我有一个表需要根据表中的值进行更新。整个表将被更新,我希望确保SQLServer将为我处理锁定。我知道我可以和LockType一起使用。但由于我的更新将类似于: SELECT MyTable.ID, MyTable.Cost INTO #tempTable from MyTable -- More complex calculations here UPDATE MyTable SET MyTable.Cost = #tempTable.Cost+1 FROM #tempTable WHE

我有一个表需要根据表中的值进行更新。整个表将被更新,我希望确保SQLServer将为我处理锁定。我知道我可以和LockType一起使用。但由于我的更新将类似于:

SELECT MyTable.ID, MyTable.Cost 
INTO #tempTable from MyTable

-- More complex calculations here

UPDATE MyTable
SET MyTable.Cost = #tempTable.Cost+1
FROM #tempTable
WHERE MyTable.ID = #TempTable.ID
我想确保我可以锁定整个表,这样,如果有另一个请求进来更新表,它就必须等待,但理想情况下,如果有读取请求进来,它就会被处理。可能吗

编辑 过程:

从表X中读取 计算 写入临时表Y X和Y之间的平均值 回信给X 在SP中,一旦执行了步骤1,我不希望处理对SP的任何其他调用,我希望它们处于队列中。由于每次更新都依赖于表中已有的值,因此我不能允许对SP的另一次调用从表中读取


通常,SP需要串行运行,不允许SP同时运行两次。我不介意调用是否通过并将SELECT排队,但一旦发生SELECT,SP中的另一个SELECT就不能在另一个线程中发生。

您可以使用SQL事务:

您是希望锁定表以进行更新,还是在执行SELECT和计算时锁定表?如果只是更新,SQL Server将为您处理。另外,如果可能的话,请指定您正在使用的SQL server版本。由于可能会出现多个更新,我需要锁定整个事件。从读取值的角度来看,不允许在表中更改任何内容,其他请求必须位于队列中。但应该仍然能够从表中读取内容。这部分将是SP,但我需要正常的查询才能单独工作。调用此SP时,如果它已在运行,则应等待。。。这是一般的想法…嗨,什么类型的交易会有效?事务本身不会强制排队,而且据我所知,它们不会强制执行排队写入。也许我错了?我可能误解了您的问题,但是围绕SP的所有查询的事务应该保持对诱人数据的隔离。也许我也错了。