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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM