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值不同,說明該數據行被更新過,這次操作就會失敗。

RowVersion類型是varbinary(8)。每當數據庫中含有RowVersion字段的表執行INSERT或UPDATE命令,該計數器的值就會遞增。該值不會回滾,即使當一個事務回滾時,或者,當一個INSERT或UPDATE事務失敗時,該值也不會回滾。

二,如何使用RowVersion?

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

1,創建RowVersion字段

使用Create Table命令,創建含有RowVersion類型字段的表

create table dbo.dt_rv
(
id int not null,
rv rowversion not null
)

2,插入新行

RowVersion字段的值是自動遞增的,不能對該列賦值

insert into dbo.dt_rv(id)
values(1)

select id,rv,@@dbts as dbts 
from dbo.dt_rv

dbts是一個全局變量RowVersion

3,更新數據行

當數據表中任意一列的值發生變化時,該字段自動遞增

update dbo.dt_rv 
set id=2 
where id=1

select id,rv,@@dbts as dbts 
from dbo.dt_rv

RowVersion字段自動設置爲全局變量@@DBTS的值
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字段的值一旦更新,就不會回滾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章