get_new_rowversion()和@@ DBTS之间的区别是什么?

时间:2016-03-11 23:34:47

标签: sql-server azure-sql-database

有谁知道 get_new_rowversion() @@ DBTS 之间的区别是什么?

我无法找到有关get_new_rowversion()的任何文档,其中一些关于互联网的文章只是SQL Azure的功能。

我还尝试在MSSQLLocalDB,SQL server和SQL Azure中运行它们。它们似乎返回相同的值。

但我不确定它们是否是等效功能。

1 个答案:

答案 0 :(得分:0)

我手边没有任何技术文档或可靠的资源,但我会尝试根据我在Azure上的经验来回答这个问题。

预计

function call(fn) { return fn(); }) @@DBTS会返回相同的结果,但会在不同的环境中使用。

对于没有经验的人,我建议MSDN参考@@DBTS更好地理解它。如果你是它,请注意它在交易中的行为,并与get_new_rowversion()进行比较/对比

引用MSDN @@ DBTS

  

返回当前数据库的当前时间戳数据类型的值。此时间戳保证在数据库中唯一

请注意当前数据库一词。因此,如果您在数据库上有镜像,并且有2个镜像和一个主数据库,那么您希望 MIN_ACTIVE_ROWVERSION() 有三个不同的值,每个数据库一个。< / p>

当您使用镜像时,您必须小心使用@@ DBTS。

@@DBTS是一个从SQL Azure中的当前数据库返回rowversion的函数。

它仅在SQL Azure中可用,并且在其他地方不起作用。

您会收到类似

的消息
  

无法找到存储过程&#39; GET_NEW_ROWVERSION&#39;。

在其他版本中。

它存在的原因是因为在SQLAzure的幕后,同步框架可能会维护DB(镜像)的多个副本,以确保在主要故障情况下镜像的快速响应。由于两个不同的DB可能具有不同的时间计数器,因此get_new_rowversion()的值将不同。

然后,如果没有用户/它知道用户/ TSQL是在处理辅助数据库实例还是主数据库实例,SQL Azure就会为rowversion返回正确值的用户/ TSQL变得非常重要。

所以拇指规则是:

  1. 在非SQL Azure版本上使用rowversion,而不是@@DBTS 定义。
  2. 在SQL Azure上使用GET_NEW_ROWVERSION,因为您不知道哪个 数据库镜像可以为您的请求提供服务,并且您将获得意外的值 来自GET_NEW_ROWVERSION