MSSQL中的rowversion和timestamp时间戳

0    182    2

Tags:

👉 本文共约2077个字,系统预计阅读时间或需8分钟。

简介

在 SQL Server 中,rowversion 是一种特殊的数据类型,也称为 timestamp。尽管它的名称是 timestamp,但它与日期和时间无关,而是用于标识表中每一行的版本号。

以下是 rowversion 数据类型的一些关键特点:

  1. 自动增加:rowversion 列会在每次更新行时自动增加其值,无需手动指定。
  2. 唯一性:每个表只能包含一个 rowversion 列,它确保每一行都有唯一的版本号。
  3. 二进制表示:rowversion 列的值以二进制形式存储,通常呈现为一个8字节的二进制数据。
  4. 不可更改:rowversion 列的值由 SQL Server 引擎管理,用户不能直接修改它们的值。

rowversion 类型通常用于实现乐观并发控制(Optimistic Concurrency Control)。当应用程序需要检测表中的数据是否发生变化时,可以使用 rowversion 列来比较行的版本号。如果两个版本号不匹配,则表示数据已被修改,可能需要采取相应的操作,如更新或回滚。

在数据表更新时,如何表征每个数据行更新时间的先后顺序?最简单的做法是使用RowVersion(行版本)字段,它和时间戳(TimeStamp)类型的功能相似,只不过TimeStamp 已过时,应避免用于产品设计中,应使用RowVersion代替。

  RowVersion是一种自增的数据类型,它只用于定义数据表的列类型,其值占用的大小(Size)是固定的8个字节,是SQL Server的数据库自动生成的、唯一的、二进制数字,数值使用binary(8)存储。

  RowVersion用于为数据表的各个数据行添加版本戳,存储大小为 8 个字节。RowVersion数据类型是永恒递增的数字,不保留日期或时间,但是可以使用RowVersion来比较数据行更新时间的先后,如果@rv1<@rv2,那么表明@rv2的更新发生在@rv1之后。

需要注意的是,SQL Server 中的 rowversion 类型与其他数据库中的 timestamp 数据类型不同。在 SQL Server 2008 及更高版本中,timestamp 被废弃并推荐使用 rowversion 来代替。

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值不同,说明该数据行被更新过。

全局变量@@DBTS

全局变量@@DBTS(DataBase TimeStamp用于返回当前数据库的RowVersion,@@DBTS 返回值的数据类型是varbinary(8),在整个数据库中是唯一的。每当数据库中含有RowVersion字段的表执行INSERT或UPDATE命令,该计数器的值就会递增。@@DBTS的值不会回滚,即使当一个事务回滚时,或者,当一个INSERT或UPDATE事务失败时,该值也不会回滚。

img

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复