SQL基础之 时间戳

本文转载:http://www.cnblogs.com/liuhh/archive/2011/05/14/2046544.html

直白对日穿这个概念比较模糊,相信有很多情人啊都见面误认为:时间穿是一个时字段,每次增多少时,填入当前底时空价值。其实就误导了过多朋友。

1.基本概念

时间戳:数据库中自动生成的绝无仅有二进制数字,与时以及日期无关之, 通常作为给表行加版本戳的编制。存储大小为 8独字节。

每个数据库都发一个计数器,当对数据库中蕴藏 timestamp 列的阐明执行插入或更新操作时,该计数器值就会大增。该计数器是数据库时间戳。这好跟踪数据库内之对立日,而休是时钟相关联的实际时间。一个表明只能有一个 timestamp 列。每次修改或插队包含 timestamp 列的最新,就会以 timestamp 列中插增量数据库时间戳值。这同属于性使 timestamp 列不适合作为键使用,尤其是未可知看做主键使用。对行的另更新都见面改 timestamp 值,从而改变键值。如果该列属于主键,那么原来的键值将于事无补,进而引用该旧值的外键也用不再实用。如果该表在动态游标中援引,则怀有更新都会改变游标中行的位置。如果该列属于索引键,则对数据行的具备更新还拿促成索引更新。

动有平等履行被的 timestamp 列可以十分轻地确定该行中之别价值由上次读取以后是否有了改。如果对行进行了改,就会见更新该日戳值。如果无对行进行转移,则该时空戳值将和以前读取该行时的日子戳值一致。若使回来数据库的手上时间戳值,请动 @@DBTS。

 2.时间戳的意图

当决定并发时起及意向: 
用户A/B同时打开某条记下开始编制,保存是好判时间穿,因为记录每次给更新时,系统还见面自动保护时间穿,所以要是保留时发现抱出来的时日穿与数据库中之工夫穿不齐,说明当是历程遭到著录受更新了,这样的话可以预防别人的创新为掩。

3.年华穿的使

简言之说一下,timestamp
主要是记录该行的尾声修改时间戳,注意,这个日子戳是不得以变为日之,只能标注该行修改了。

发生啊用呢?通常是为此在数码增量更新方面,比如说,我由该表复制数据及另外一个申明,但是若本身想单独复制更新了之,那么自从最后一潮创新的当儿,记录最酷之timestamp的价,然后以时创新的时,只要where条件找来过最后一不行创新的
timestamp
值的保有执行。然后抽取到履新了之多少,进行复制到另外一个服务器,这就是是增量更新用到的。

4.当SQL中的行使例子

(**微软的建议 — timestamp 语法已受代表,在
DDL 语句,请尽量用 rowversion 而非是 timestamp。未来之 Microsoft SQL Server
版本将移除这项功能。**

参见http://msdn.microsoft.com/zh-cn/library/ms182776.aspx)

RowsVersion就是timestamp

丢失更新的解决方法    

丢失更新概念:当用户同时修改一行数据,他们先读取数据,放在前端进行修改,当修改后,再提交数据,这样最后提交的数据会覆盖先前提交的数据,

这样就造成了丢失更新。

长话短说,介绍防止丢失更新的方法:

使用RowsVersion时间戳。

每次更新的时候,mssql都会自动的更新rowversion的值,若一行在读前与更新前的值前后不一致,就说明有其他的事务更新了此列,这样就可以不更新此列,

从而防止了丢失更新的情况。

例子 : 

 declare table tmp(a varchar(10),b rowsversion)                                                                                                          

insert into tmp(a) values( 'abc')

事务A:

declare @rv rowversion

select @rv=b from tmp where a='abc'

waitfor delay '00:00:05'

update tmp set a='xyz' where b=@rv

事务B:

update tmp set a='aaa' where b=@rv

事务A在执行完毕后会发现并没有将'aaa'给抹去,这样就防止了丢失更新的现象。 

 
注意:

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

 

注意

通过使用在其 SELECT 列表中包含了 rowversion 列的 SELECT INTO 语句,可以生成重复的 rowversion 值。

建议不要以这种方式使用 rowversion。

 

添加数据 如高并发的情况下 时间戳会相同吗

是肯定会相同的,如果你的并发在一秒内有多条信息插入,那么时间戳肯定会相同

 

相关文章