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 ...
随机推荐
- IDA显示字节机器码
默认居然不显示,有点坑. 要像CE一样显示出来,需要 菜单 Options >> General Disassembly选项卡Number of opcode bytes写上非0,写1好像 ...
- java web中的异常处理
1.集中处理 参考:https://blog.csdn.net/weililansehudiefei/article/details/73691294
- 6.装配Bean基于注解
1.注解:就是一个类,使用@注解名称 开发中:使用注解 取代 xml配置文件. @Component取代<bean class=""> @Component(" ...
- typescript handbook 学习笔记2
概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...
- C#6.0语言规范(三) 基本概念
应用程序启动 具有入口点的程序集称为应用程序.运行应用程序时,会创建一个新的应用程序域.应用程序的几个不同实例可以同时存在于同一台机器上,并且每个实例都有自己的应用程序域. 应用程序域通过充当应用程序 ...
- 解决SpringBoot jar包太大的问题
转载 2017年09月18日 09:21:53 577 SpringBoot的web应用一般都添加了spring-boot-maven-plugin插件. Maven xml代码 <buil ...
- Spring Boot功能实战
添加web功能启动器 添加了Spring Boot基础依赖后,如要使用web mvc功能,只需要添加如下启动器即可,Spring Boot会自动装配web功能. <dependencies> ...
- Python内置类型(6)——生成器
上节内容说到Python的for语句循环本质上就是通过调用Iterable可迭代对象的__iter()__方法获得一个Iterator迭代器对象,然后不断调用Iterator迭代器对象__next() ...
- 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 1.Programming assignments:Building a recurrent neural network - step by step
Building your Recurrent Neural Network - Step by Step Welcome to Course 5's first assignment! In thi ...
- QC内部分享ppt
Quality Center是一个基于Web的测试管理工具,可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality Center还可以创建报 ...