在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于产品设计中,应使用RowVersion代替。

RowVersion是一种自增的数据类型,它只用于定义数据表的列类型,其值占用的大小(Size)是固定的8个字节,是SQL Server的数据库自动生成的、唯一的、二进制数字,数值使用binary(8)存储。RowVersion用于为数据表的各个数据行添加版本戳,存储大小为 8 个字节。RowVersion数据类型是永恒递增的数字,不保留日期或时间,但是可以使用RowVersion来比较数据行更新时间的先后,如果@rv1<@rv2,那么表明@rv2的更新发生在@rv1之后。

一,RowVersion是如何递增的?

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

RowVersion字段的特性:

  1. 由于每个数据库只有一个Counter,因此,RowVersion的值在当前数据库中是唯一的,所有拥有RowVersion字段的数据表,该字段的值都是不同的;
  2. 数据库的RowVersion 只会递增,不会回滚;如果更新表数据(Insert或Update)的事务回滚,该数据表的RowVersion字段的值会回滚,但是数据库的RowVersion不会回滚;
  3. 由数据库自动赋值,在Insert或Update命令中,不能显式赋值;

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

1,全局变量@@DBTS

全局变量@@DBTS(DataBase TimeStamp用于返回当前数据库的RowVersion,@@DBTS 返回值的数据类型是varbinary(8),在整个数据库中是唯一的。每当数据库中含有RowVersion字段的表执行INSERT或UPDATE命令,该计数器的值就会递增。@@DBTS的值不会回滚,即使当一个事务回滚时,或者,当一个INSERT或UPDATE事务失败时,该值也不会回滚。

select @@DBTS

2,下一个数据库行版本(Database RowVersion)

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

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

二,如何使用RowVersion?

RowVersion用于表征行的更新顺序,在数据库中,其值是唯一的。

1,创建RowVersion字段

使用Create Table命令,创建含有RowVersion类型字段的表

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

2,插入新行

RowVersion字段的值是自动递增的,不能对该列赋值,但是,当插入一行数据时,该字段自动设置为全局变量@@DBTS的值

insert into dbo.dt_rv(id)
values(1) select id,rv,@@dbts as dbts
from dbo.dt_rv

3,更新数据行

当数据表中任意一列的值发生变化时,RowVersion字段自动设置为全局变量@@DBTS的值

update dbo.dt_rv
set id=2
where id=1 select id,rv,@@dbts as dbts
from dbo.dt_rv

4,RowVersion字段的值不会回滚

当更新(INSERT或UPDATE)事务回滚时,RowVersion字段的值不会回滚,使用的是@@DBTS的值:

begin tran
  insert into dbo.dt_rv(id)
  values(1)
rollback tran
select id,rv,@@dbts as dbts
from dbo.dt_rv

当事务回滚时,RowVersion字段的值不会回滚,但数据库的RowVersion字段的值会递增,这是因为数据库计数器(Counter)不在事务内,其值只会递增,不会回滚,因此,RowVersion字段的值一旦更新,就不会回滚。

参考文档:

RowVersion (Transact-SQL)

RowVersion数据类型的更多相关文章

  1. Sql Server之数据类型详解

      数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为 ...

  2. SQL Server 数据类型

    数据类型的选择帮助优化查询,比如针对int类型列和针对文本类型列可能会生成完全不同的查询计划 三种数据类型: 系统数据类型 别名数据类型:用户可以为系统数据类型提供一个别名,并且可以对数据类型做进一步 ...

  3. timestamp 与 rowversion

    联机丛书: timestamp timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的.timestamp 一般用作给表行加版本戳的机制.存储大小为 8 字节. 注释 T ...

  4. SqlServer中日期和时间数据类型及函数 【转】

    来源:http://blog.csdn.net/royalwzy/article/details/6446075 日期和时间数据类型 下表列出了 Transact-SQL 的日期和时间数据类型. 数据 ...

  5. sqlserver中的rowversion

    rowversion 公开数据库中自动生成的唯一二进制数字的数据类型.rowversion通常用作给表行加版本戳的机制,存储大小为8字节.rowversion数据类型只是递增的数字,不保留日期或时间. ...

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

    一:系统数据类型 2.浮点数据类型 3.字符数据类型 4.日期和时间数据类型 5.文本和图形数据类型 6.货币数据类型 7.位数据类型 8.二进制数据类型 9.其他数据类型 二:自定义数据类型   数 ...

  7. SQLServer之数据类型解析

    数字 int.bigint.smallint 和 tinyint 使用整数数据的精确数字数据类型. 数据类型 范围 存储 tinyint 0 到 255. 1 字节 smallint -2^15 (- ...

  8. 转:RowVersion 用法

    在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于 ...

  9. RowVersion 用法

    在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于 ...

随机推荐

  1. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  2. C# Web应用调试开启外部访问

    在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...

  3. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  4. NodeJs之pm2

    pm2 pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能. 开发过程中建议时不时的参看官方详细命令行使用:命令行 pm2 ...

  5. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  6. ExtJS 4.2 业务开发(一)主页搭建

    本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...

  7. SQL必备知识点

    经典SQL语句大全 基础 1.说明:创建数据库.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 device.说明:创建新表crea ...

  8. 【开源】.Net Api开放接口文档网站

    开源地址:http://git.oschina.net/chejiangyi/ApiView 开源QQ群: .net 开源基础服务  238543768 ApiView .net api的接口文档查看 ...

  9. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  10. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...