zoukankan      html  css  js  c++  java
  • 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字段的特性:

    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)

  • 相关阅读:
    java数据结构-循环链表实现
    java数据结构-普通链表实现测试
    java数据结构-普通链表实现
    java数据结构-排序算法-插入算法
    java数据结构-排序算法-快排算法
    java数据结构-递归算法-简单递归算法
    python------------------异常处理
    自定义Web框架
    Django框架第一篇
    Django框架之第二篇
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4791838.html
Copyright © 2011-2022 走看看