Sql server SQL server和触发器反映的更改顺序?

Sql server SQL server和触发器反映的更改顺序?,sql-server,triggers,Sql Server,Triggers,假设我有一个表,我在update之后设置了一个触发器,它更新了相同的已更改行中的一列 是否承诺在更新后但在有人尝试读取值之前立即执行触发器 例如: 有一个更新触发器,它将“IsNameSet”设置为1(当名称被修改时) updatemytable set name=“a”其中id={…} 然后马上(!) 从myTable中选择IsNameSet,其中id=…{modified row id} 它是否保证我将始终看到1?如果SELECT发生在UPDATE事务(包括触发器)提交之前,则它取决于读取事

假设我有一个表,我在update之后设置了一个
触发器,它更新了相同的已更改行中的一列

是否承诺在更新后但在有人尝试读取值之前立即执行触发器

例如:

有一个更新触发器,它将
“IsNameSet”
设置为
1
(当
名称
被修改时)

updatemytable set name=“a”其中id={…}

然后马上(!)

从myTable中选择IsNameSet,其中id=…{modified row id}


它是否保证我将始终看到
1

如果
SELECT
发生在
UPDATE
事务(包括触发器)提交之前,则它取决于读取事务的隔离级别

在readuncommitted时,它可以读取
name=“a”和IsNameSet=0

如果是快照,则可以读取行的更新前值。否则,它将被阻止读取该行,直到
UPDATE
事务提交并读取“after”值


根据具体要求,计算列可能比触发器更有效。

那么您是说将
IsNameSet
列设置为计算列?但这不也取决于隔离级别吗?@RoyiNamir-仅仅是基于效率的考虑。触发器有额外的开销,因为它们需要填充插入的
和删除的
表。但是如果您需要引用列的“before”值,那么计算列将不起作用。您所说的“仅仅基于效率”是什么意思(对不起,不知道它是什么意思)。这是对“它是否也取决于隔离级别”的回答吗?@RoyiNamir如果计算列被持久化,可能会出现
readuncommitted
也会返回不一致的结果的情况。但是如果
SELECT
查询想要事务一致的结果,那么它无论如何都不应该使用
readuncommitted