SQL Server:CTE更新是否像事务一样工作?

SQL Server:CTE更新是否像事务一样工作?,sql,sql-server,Sql,Sql Server,我使用这样的查询来更新表中的某些列: WITH MyTable AS ( SELECT TOP 1 *, ROW_NUMBER() OVER (ORDER BY T.dtDate ASC) AS RowNum FROM important.Table T WHERE bWorking = 1 ) UPDATE MyTable SET iIDfkToOtherTable = 6 WHERE RowNum

我使用这样的查询来更新表中的某些列:

WITH MyTable AS
(
    SELECT TOP 1 
        *, 
        ROW_NUMBER() OVER (ORDER BY T.dtDate ASC) AS RowNum
    FROM 
        important.Table T
    WHERE 
        bWorking = 1
)
UPDATE MyTable
SET iIDfkToOtherTable = 6
WHERE RowNum = 1

此语句中有两个查询(
SELECT
UPDATE
),因此我不确定当我处于
SELECT
UPDATE
之间时,其他用户是否能够更改“important.Table”值。有人能给我一个线索吗?谢谢

为了原子性,它本质上是一个单一的查询。它本质上与更新相同。。。从这些方面来说:

事实上,这里有一个类似但不同的问题,建议使用这样一个CTE来实现原子性,而不是两步选择/更新:


不要把它看作两个问题。这是程序性思维。SQL Server是基于集合的,在本例中,您定义的是一个结束状态“这组数据将应用此转换”


作为一个单一的定义,它始终是原子的。

您能提供一些示例数据和exepct结果吗?这里只有一个查询。谢谢。我处理这个问题是因为我使用两个机器人在同一个表中保存和检索数据,它们总是死锁。我会继续检查它。@DavidSantiagoBermdezCaldern我不想进入扩展的主题外讨论,但通常如果您由于“选择然后更新”类型的问题而出现死锁,您会看到两个带有共享锁的查询试图升级为更新的独占锁。这篇文章很老,但是是一个很好的起点,仍然有报告和不同的方式来查看事务锁类型(独占/共享):