添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用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

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

在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于产品设计中,应使用RowVersion代替。RowVersion是一种自增的数据类型,它只用于定义数据表的列类型,其值占用的大小(Size)是固定的8个字节,是SQL Server的数据库自动生成的...
本文介绍如何处理多个用户并发更新同一实 体(同时)时出现的冲突 。 主要是两种:一种,检查属性并发冲突,使用 [ConcurrencyCheck] ;另一种,检测行的并发冲突,使用 rowversion 跟踪属性,如果在保存之前有修改,就报错 发生并发冲突的情况: 1.用户导航到实体编辑页面; 2.第一个用户的更改还未写入数据库之前,另一个用户更新同一实体; 此时,如果未启用并发检测,当发生更新时: 最后一个更新优先。即最后一个更新的值保存到数据库。而第一个保存的值将丢失。 举个例子: 1. Jane 访问 院系 编辑页 面,将英 语 系的 预 算 从 350,000.00 美元更改
微软官方文档:rowversion (Transact-SQL) 在sqlsever中 timestamp和rowversion是同义词,它和 ISO 标准中定义的 timestamp 数据类型表现不同。 在sqlserver中,timestamp的作用是给每行的数据加上版本标志,但这个标志和时间没有任何关系,可以将它看成是byte[8]数组并且是数据库全局自增的。 因为timestamp的取值是
timestamp 与 rowversion 二者是 SQL Server 中的数据类型,二者是同义词,就是说二者的数据类型是完全一样的。 在企业管理器中,我们只能选择 timestamp 作为列名,但在 T-SQL 中(比如查询分析器),我们既可以用 timestamp,也可以用 rowversion。 那么在 T-SQL 中,我们该用哪个呢,该用 rowversion。因为微软定义的 ti
* &lt;div class="form-group"&gt; // 原始 * &lt;div class="form-group hidden"&gt; // 修改后 * 原始: @Html.EditorFor(model =&gt...
SQL Server 数据类型 ROWVERSION RowVersion数据类型是系统自动生成的,唯一的,二进制数字,数值和binary(8)相同,RowVersion通常用作给Table的数据行加版本戳,存储大小为 8 个字节。RowVersion数据类型只是永恒递增的数字,不保留日期或时间,但是可以使用RowVersion来比较数据行更新时间的先后. CREATE TABLE fac...
在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp已过时,应避免用于产品设计中,应使用RowVersion代替。 RowVersion是一种自增的数据类型,它只用于定义数据表的列类型,其值占用的大小(Size)是固定的8个字节,是SQL Server的...
丢失更新的解决方法     丢失更新概念:当用户同时修改一行数据,他们先读取数据,放在前端进行修改,当修改后,再提交数据,这样最后提交的数据会覆盖先前提交的数据,这样就造成了丢失更新。 长话短说,介绍防止丢失更新的方法: 使用RowsVersion时间戳。 每次更新的时候,mssql都会自动的更新rowversi
  数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型、数值类型以及日期类型等。数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源。   Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者...
来自:http://zhidao.baidu.com/question/287281483.html timestamp timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。 Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp
在SQL Server中,可以使用内置数据类型datetime2和datetimeoffset来表示日期和时间。datetime2的范围从公元1年1月1日到公元9999年12月31日,精度为100纳秒。datetimeoffset可以在datetime2的基础上提供时区偏移量。 在SQL Server中,时间戳可以使用ROWVERSION或TIMESTAMP数据类型来表示,并用于记录和管理表中的数据更改。这些数据类型在每次更改表中的行时自动递增,并且可以用于防止并发更新和重复插入。 要在SQL Server中插入日期和时间,可以使用T-SQL中的GETDATE()函数。例如,INSERT INTO myTable (name, createdDate) VALUES ('John', GETDATE()); 要在SQL Server中获取当前日期和时间,可以使用T-SQL中的GETDATE()函数。例如,SELECT GETDATE(); 将返回当前日期和时间。 如果需要在SQL Server中执行日期和时间计算,可以使用DATETIME2FROMPARTS、DATEFROMPARTS和TIMEFROMPARTS等功能。例如,可以使用DATETIME2FROMPARTS函数将年、月、日、小时、分钟、秒和毫秒值组合成一个datetime2值。 总之,SQL Server提供了许多用于处理日期、时间和时间戳的内置功能和数据类型,可以手动创建日期和时间戳,也可以使用自动递增的ROWVERSION和TIMESTAMP数据类型来管理数据更改和表中的并发访问。