RowVersion数据类型

RowVersion数据类型是系统自动生成的,唯一的,二进制数字,数值和binary(8)相同,RowVersion通常用作给Table的数据行加版本戳,存储大小为 8 个字节。RowVersion数据类型只是永恒递增的数字,不保留日期或时间,但是可以使用RowVersion来比较数据行更新时间的先后,如果@rv1<@rv2,那么表明@rv2的更新发生在@rv1之后。

每个数据库都只有一个自增的计数器(Counter),每次对拥有RowVersion 字段的Table执行Insert或Update命令,该计数器都会增加。一个Table最多有一个RowVersion 字段,只要对Table执行Insert或Update命令,该字段就会被更新为计数器(Counter)的最新值。

Each database has a counter that is incremented for each insert or update operation that is performed on a table that contains a rowversion column within the database. This counter is the database rowversion. This tracks a relative time within a database, not an actual time that can be associated with a clock. A table can have only one rowversion column. Every time that a row with a rowversion column is modified or inserted, the incremented database rowversion value is inserted in the rowversion column.

RowVersion字段的特性:

  1. 由于每个数据库只有一个Counter,因此,RowVersion的值在当前数据库中是唯一的,所有拥有RowVersion字段的Table,该字段的值都是不同的;
  2. RowVersion 只会递增,不会回滚;如果数据的更新(Insert或Update)的事务回滚,RowVersion字段不会回滚;
  3. TimeStamp 已过时,避免用于产品设计中,使用RowVersion代替;

在 Table 中增加RowVersion字段,能够检查该行是否被更新(insert或update),如果当前值跟最近一次记录的RowVersion值不同,说明该数据行被更新过。

You can use the rowversion column of a row to easily determine whether any value in the row has changed since the last time it was read. If any change is made to the row, the rowversion value is updated. If no change is made to the row, the rowversion value is the same as when it was previously read.

一,查看当前数据库的RowVersion

1,全局变量@@DBTS用于返回当前数据库的RowVersion,@@DBTS 返回值的数据类型是varbinary(8)。

@@DBTS value is not rolled back when a transaction rolls back or when an INSERT or UPDATE query causes an error.

@@DBTS returns the value of the current rowversion data type for the database. The rowversion is guaranteed to be unique in the database. @@DBTS returns a varbinary which is the last-used rowversion value of the current database. A new rowversion value is generated when a row with a rowversion column is inserted or updated. Any INSERT, UPDATE and CREATE queries will internally increment the rowversion values.

2,非确定性函数 MIN_ACTIVE_ROWVERSION() 用于返回当前数据库的下一个RowVersion值,其值是@@DBTS+1。

MIN_ACTIVE_ROWVERSION is a non-deterministic function that returns the lowest active rowversion value in the current database. A new rowversion value is typically generated when an insert or update is performed on a table that contains a column of typerowversion. If there are no active values in the database, MIN_ACTIVE_ROWVERSION returns the same value as @@DBTS + 1.

select @@DBTS as dbts,MIN_ACTIVE_ROWVERSION() as min_active

二,示例

1,查看数据库当前的RowVersion

declare @rv rowversion
set @rv=@@DBTS
select @rv as rv

2,创建含有RowVersion列的表,并插入数据

create table dbo.dt_rv
(
id int not null,
rv rowversion not null
)

insert into dbo.dt_rv(id)
values(1)

3,查看当前的RowVersion和表中的数据

select id,rv,@@dbts as dbts
from dbo.dt_rv

4,更新表,查看RowVersion值的变化

update dbo.dt_rv
set id=2
where id=1

select id,rv,@@dbts as dbts
from dbo.dt_rv

5,测试事务rollback时,RowVersion值的变化

begin tran 

insert into dbo.dt_rv(id)
values(1)

rollback tran 

select id,rv,@@dbts as dbts
from dbo.dt_rv

当事务回滚时,RowVersion字段的值不会回滚,RowVersion字段的值只会递增。

参考文档:

rowversion (Transact-SQL)

时间: 2024-10-29 04:28:22

RowVersion数据类型的相关文章

c语言数据库数据类型

数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源. ??Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会自动将类型转换为smallint 或者tinyint,这样一来,在存储数

c#SQLserver数据类型

c#SQLserver数据类型 Sql Server之数据类型详解 ??数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源. ??Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会

Sql Server之数据类型详解

  数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源.  Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会自动将类型转换为smallint 或者tinyint,这样一来,在存储

timestamp 与 rowversion

联机丛书: timestamp timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的.timestamp 一般用作给表行加版本戳的机制.存储大小为 8 字节. 注释 Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp 数据类型不同.SQL-92 timestamp 数据类型等价于 Transact-SQL datetime 数据类型. Microsoft® SQL Server™ 将来的版本可能会修改 Tra

sqlserver常用数据类型(精炼版)

一:系统数据类型 2.浮点数据类型 3.字符数据类型 4.日期和时间数据类型 5.文本和图形数据类型 6.货币数据类型 7.位数据类型 8.二进制数据类型 9.其他数据类型 二:自定义数据类型   数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源.  Sql Server 还能自动限制每个数据类型的取值范围,例如定义了

RowVersion 用法

在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于产品设计中,应使用RowVersion代替. RowVersion是一种自增的数据类型,它只用于定义数据表的列类型,其值占用的大小(Size)是固定的8个字节,是SQL Server的数据库自动生成的.唯一的.二进制数字,数值使用binary(8)存储.RowVersion用于为数据表的各个数据行添

SQL Server 之 - 变更追踪 2

正如前面文章说道的,SQLServer 2008提供了两种实现变更追踪的功能,本部分主要讨论的是Change Tracking功能. 激活ChangeTracking 我们可以通过如下的步骤来激活和使用ChangeTracking功能: 1. 在数据库级别激活Change Tracking 使用下面的语句在数据库上激活该功能(或者在SSMS的属性弹出框中激活),它的两个参数分别表示变更信息的存活时间以及是否激活自动清除变更信息任务: 2. 在需要的表上激活Change Tracking 我们需要

关于timestamp的二三事

之所以要写timestamp的随笔,是因为之前对它的理解存在误区,so. I have to remind myself by writing this informal essay. 微软文档链接:https://msdn.microsoft.com/zh-cn/library/ms182776.aspx 释义(rowversion和timestamp是一样的好比C#里的(String和string是一个概念 同义词,写法不一样而已 ),不过微软好像建议用 rowversion ,数据库上操作

Step6:SQL Server 数据变更时间戳(timestamp)在复制中的运用

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two) 方案三(Solution Three) 实现过程(Process) 注意事项(Attention) 参考文献(References) 二.背景(Contexts) SQL Server数据库中Basic与Group两个表需要提供部分字段给其它程序读取,程序把这两个表的数据缓存到内存中,但是程序想