2

撇开从 SQL 服务器获取“表差异”的可能更好的 方法UpdTime不谈 - 假设我有一个带有type 列的表,它在每次插入和更新时都datetime使用它进行设置和更新,如下所示:getdate()

UPDATE mytable SET Updtime=getdate(), ... WHERE ...
INSERT INTO mytable VALUES (getdate(),...)

经过初步

SELECT getdate() AS Now, ... FROM mytable WITH(readcommitted,rowlock)

我曾经读取所有行并将值存储Now在一个变量lastNow中,然后我继续定期做

SELECT getdate() AS Now, ... FROM mytable WITH(readcommitted,rowlock) WHERE UpdTime >= lastNow;

调用,总是将新的存储Now到我的lastNow变量中。

我可以确保永远不会错过任何更改(显然 DELETE 除外)吗?还是这取决于某些设置?

顺便说一句,看到两次更改不会打扰我,只会错过更改。

编辑我刚刚添加WITH(readcommitted,rowlock)到上面的SELECT语句中,因为这就是我想要添加“差异”功能的旧语句的样子。

4

2 回答 2

1

getdate()是一个运行时常量函数,意味着它被评估一次,并且在整个语句中使用相同的值。

readcommitted在默认级别,UPDATE语句开始并评估GETDATE()然后SELECT语句开始并在完成更新所有行GETDATE()之前获得稍后的值当然是可能的。UPDATE

如果s 以与 sSELECT不同的顺序定位行UPDATE(可能两者使用不同的索引访问方法)或在UPDATE计划中有阻塞运算符(例如用于万圣节保护),则SELECT可以在行尚未更新之前读取行。这些行将不会在下一次请求时被读取,因为Updtime它们最终将接收到的值小于该lastNow值。

如果UPDATE计划包含一个阻塞操作符,那么这甚至可能在serializable.

于 2013-06-12T09:11:03.257 回答
0

我不确定您的问题是什么,因为“我可以确保永远不会错过任何更改(显然,删除除外)?还是这取决于某些(事务性?)设置?” 似乎暗示如果进行更改(然后回滚)您想看到它吗?我不确定您是否想查看是否进行了尝试更改?

除非您的选择包含“读脏”提示,否则您不会看到更改。如果是这样,您将看到所有已提交的更改和所有未提交的更改,但不会看到回滚的更改,因为它们不再存在。使用脏读,您将返回原始行和未提交(更新)的行。

使用 getdate() 的另一个方面是它可以精确到 1000 秒,这在过去是可以的,但是使用现代并行处理器,很有可能获得具有相同 GetDate() 值的多个更新。

于 2013-06-12T08:29:13.393 回答