在數據表更新時,如何表徵每一個數據行更新時間的前後順序?最簡單的作法是使用RowVersion(行版本)字段,它和時間戳(TimeStamp)類型的功能類似,只不過TimeStamp 已過期,應避免用於產品設計中,應使用RowVersion代替。html
RowVersion是一種自增的數據類型,它只用於定義數據表的列類型,其值佔用的大小(Size)是固定的8個字節,是SQL Server的數據庫自動生成的、惟一的、二進制數字,數值使用binary(8)存儲。RowVersion用於爲數據表的各個數據行添加版本戳,存儲大小爲 8 個字節。RowVersion數據類型是永恆遞增的數字,不保留日期或時間,可是可使用RowVersion來比較數據行更新時間的前後,若是@rv1<@rv2,那麼代表@rv2的更新發生在@rv1以後。數據庫
每一個數據庫都只有一個自增的計數器(Counter),該計數器是Database RowVersion,每次對擁有RowVersion 字段的數據表執行Insert或Update命令,該計數器都會增長。一個數據表最多有一個RowVersion 字段,只要對數據表執行Insert或Update命令,該字段就會被更新爲計數器(Counter)的最新值。函數
RowVersion字段的特性:ui
在數據表中增長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用於表徵行的更新順序,在數據庫中,其值是惟一的。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