[转载]timestamp 时间戳 处理程序并发

做项目需要用到这个特性。

我使用navicat,如果将日期类型选择为timestamp时,会发现IDE多了一个选项:

查看IDE自动生成的sql语句:

 写道
`lastUpdate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP

 如果去掉这个选项后:

 写道
`lastUpdate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

 区别就是“ ON UPDATE CURRENT_TIMESTAMP”了,他的作用就是当记录有“变化“时会自动更新lastUpdate时间为系统当前时间。

注意:特意强调了有变化,换句话说,即使使用update语句,但是内容没有变化的话,该值就不会自动更新了。

 

timestamp 时间戳 处理程序并发

分类: SQL ASP.Net C# 2.0/3.5 992人阅读 评论(0) 收藏 举报

说明:
公开数据库中自动生成的唯一二进制数字的数据类型。timestamp 通常用作给表行加版本戳的机制。存储大小为 8 个字节。

备注

每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。该计数器是数据库时间戳。这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。一个表只能有一个 timestamp 列每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。

使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。如果对行进行了更改,就会更新该时间戳值。如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。若要返回数据库的当前时间戳值,请使用 @@DBTS。

Transact-SQL timestamp 数据类型不同于在 SQL-2003 标准中定义的 timestamp 数据类型。SQL-2003 timestamp 数据类型等同于 Transact-SQL datetime 数据类型。

rowversion 的数据类型为 timestamp 数据类型的同义词,并具有数据类型同义词的行为。在 DDL 语句,请尽量使用 rowversion 而不是 timestamp。有关详细信息,请参阅 数据类型同义词 (Transact-SQL)。

在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型指定列名,例如:

 复制代码
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);
 

如果不指定列名,则 Microsoft SQL Server 2005 Database Engine 将生成 timestamp 列名;但 rowversion 同义词不具有这样的行为。在使用 rowversion 时,必须指定列名。

注意: 
在使用其中的 SELECT 列表中具有 timestamp 列的 SELECT INTO 语句时,可能会生成重复的时间戳值。建议不要以这种方式使用 timestamp。
 

-----------------------------------
@@DBTS

备注
@@DBTS 返回当前数据库最后使用的时间戳值。插入或更新包含 timestamp 列的行时,将产生一个新的时间戳值。

返回类型
varbinary

示例
以下示例从 AdventureWorks 数据库返回当前的 timestamp。

 复制代码
USE AdventureWorks;
GO
SELECT @@DBTS
 


不可为空的 timestamp 列在语义上等同于 binary(8) 列。可为空的 timestamp 列在语义上等同于 varbinary(8) 列。

在SQL Server中联机丛书是这样说的:

SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。

我用口水话解释一下便于理解:

我们知道数字类型有个“标识”属性,设置好“标识种子”、“标识递增量”,每增加一条记录时,这个字段的值就会在最近的一个标识值基础上自动增加,这样我们可以知道哪些记录是先添加的,哪些记录是后添加的,但是我们无法知道哪些记录修改过。timestamp这个类型的字段呢,每增加一条记录时,它会在最近的一个时间戳基础上自动增加,当修改某条记录时,它也会在最近的一个时间戳基础上自动增加,所以我们就知道哪些记录修改过了。

通过 时间戳 控制并发:

显示数据时先取出timestamp到变量,更新、删除操作时先比较变量和现在的timestamp。一样则可操作 否则不允许。

将timestamp转成10进制----select convert(bigint,tstamp) ts from table_name;

控制并发的另一种方法:

可以定义一个 字段做mark,前提要写一个触发器,当更新或新增时mark自动加1,即可与时间戳 相似

原文地址:https://www.cnblogs.com/fx2008/p/2796897.html