轉:RowVersion 用法

在數據表更新時,如何表徵每一個數據行更新時間的前後順序?最簡單的作法是使用RowVersion(行版本)字段,它和時間戳(TimeStamp)類型的功能類似,只不過TimeStamp 已過期,應避免用於產品設計中,應使用RowVersion代替。html

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字段的特性:ui

  1. 因爲每一個數據庫只有一個Counter,所以,RowVersion的值在當前數據庫中是惟一的,全部擁有RowVersion字段的數據表,該字段的值都是不一樣的;
  2. 數據庫的RowVersion 只會遞增,不會回滾;若是更新表數據(Insert或Update)的事務回滾,該數據表的RowVersion字段的值會回滾,可是數據庫的RowVersion不會回滾;
  3. 由數據庫自動賦值,在Insert或Update命令中,不能顯式賦值;

在數據表中增長RowVersion字段,可以檢查該行是否被更新(insert或update),若是當前值跟最近一次記錄的RowVersion值不一樣,說明該數據行被更新過。spa

1,全局變量@@DBTS設計

全局變量@@DBTS(DataBase TimeStamp用於返回當前數據庫的RowVersion,@@DBTS 返回值的數據類型是varbinary(8),在整個數據庫中是惟一的。每當數據庫中含有RowVersion字段的表執行INSERT或UPDATE命令,該計數器的值就會遞增。@@DBTS的值不會回滾,即便當一個事務回滾時,或者,當一個INSERT或UPDATE事務失敗時,該值也不會回滾。3d

select @@DBTS

2,下一個數據庫行版本(Database RowVersion)code

非肯定性函數 MIN_ACTIVE_ROWVERSION() 用於返回當前數據庫的下一個RowVersion值,其值是@@DBTS+1。htm

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

二,如何使用RowVersion?

RowVersion用於表徵行的更新順序,在數據庫中,其值是惟一的。blog

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

相關文章
相關標籤/搜索