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字段的值一旦更新,就不会回滚。

    转自:https://www.cnblogs.com/ljhdo/archive/2016/10/14/4791838.html

  • 相关阅读:
    从零开始——PowerShell应用入门(全例子入门讲解)
    详解C# Tuple VS ValueTuple(元组类 VS 值元组)
    How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On——RHEL Pacemaker中配置STONITH
    DB太大?一键帮你收缩所有DB文件大小(Shrink Files for All Databases in SQL Server)
    SQL Server on Red Hat Enterprise Linux——RHEL上的SQL Server(全截图)
    SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)
    微软SQL Server认证最新信息(17年5月22日更新),感兴趣的进来看看哟
    Configure Always On Availability Group for SQL Server on RHEL——Red Hat Enterprise Linux上配置SQL Server Always On Availability Group
    3分钟带你了解PowerShell发展历程——PowerShell各版本资料整理
    由Find All References引发的思考。,
  • 原文地址:https://www.cnblogs.com/jearay/p/9843469.html
Copyright © 2011-2022 走看看