RowVersion 用法
在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用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字段的特性:
- 由于每个数据库只有一个Counter,因此,RowVersion的值在当前数据库中是唯一的,所有拥有RowVersion字段的数据表,该字段的值都是不同的;
- 数据库的RowVersion 只会递增,不会回滚;如果更新表数据(Insert或Update)的事务回滚,该数据表的RowVersion字段的值会回滚,但是数据库的RowVersion不会回滚;
- 由数据库自动赋值,在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 用法的更多相关文章
- 转:RowVersion 用法
在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于 ...
- EF里Guid类型数据的自增长、时间戳和复杂类型的用法
通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...
- EF——Guid类型数据的自增长、时间戳和复杂类型的用法 03 (转)
EF里Guid类型数据的自增长.时间戳和复杂类型的用法 通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
随机推荐
- Centos 7 搭建.net web项目
现在的.NET Core 1.0版本是一个很小的核心,APIs和工具也并不完整,但是随着.Net Core的不断完善,补充的Apis和创新也会一起整合到.NET Framework中. 安装cento ...
- bzoj4555(多项式求逆解法)
//和以前写的fft不太一样,可能是因为要取模?? #include<iostream> #include<cstring> #include<cmath> #in ...
- Internetworking
1 Introduction 所谓的InternetWorking就是将很多网络连接起来,那么在这种连接的网络下我们该如何传送封包呢? 2 IP and Routers 1 IP Datagram H ...
- Rabbit RPC 代码阅读(一)
前言 因为想对RPC内部的机制作一个了解,特作以下阅读代码日志,以备忘. RPC介绍 Rabbit RPC 原理可以用3点概括: 1.服务端启动并且向注册中心发送服务信息,注册中心收到后会定时监控服务 ...
- Varnish实现Web站点加速
Varnish 是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang使用3台Varnish代替了原来的12台Squid,性能比以前更好. Varnish 的作者Poul-He ...
- Java中的Lock接口
Synchronized & Lock synchronized 是Java语言中的关键字,由monitorenter,monitorexit两个指令实现.JVM会将monitorenter指 ...
- Create-React-App项目外使用它的eslint配置
概述 使用Create-React-App脚手架感觉它的eslint配置有点好用,于是考虑不用Create-React-App脚手架该怎么使用这些配置. 我于是eject了Create-React-A ...
- C#基础-gc算法
众所周知,c++是需要程序员手动管理内存的,然而手动释放内存很容易被程序员遗漏,从而导致资源浪费或内存泄露.为解决这个问题,垃圾回收器诞生了,代替程序员自动管理内存的释放.至于gc算法则是垃圾回收器清 ...
- Postgresql日志收集
PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off ...
- IDEA的maven配置
刚接触maven的时候,也知道maven目录下有个setting文件可以设置远程maven库的地址,但自己实践的时候,发现setting文件的地址都被注释掉了,但是jar包还是能成功下载下来,那这个下 ...