SQL基础之 时间戳

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

直白对时间戳这些概念比较模糊,相信有许多朋友也都会误认为:时间戳是2个小时字段,每一回扩展数据时,填入当前的时间值。其实那误导了无数有情人。

1.基本概念

时间戳:数据库中自动生成的唯一二进制数字,与时光和日期非亲非故的, 平时作为给表行加版本戳的编写制定。存款和储蓄大小为 九个字节。

各类数据库都有贰个计数器,当对数据库中含有 timestamp 列的表执行插入或更新操作时,该计数器值就会大增。该计数器是数据库时间戳。那能够跟踪数据库内的对峙即间,而不是时钟相关联的莫过于时间。二个表只可以有二个 timestamp 列。每一趟修改或插队包涵 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。这一属性使 timestamp 列不适同盟为键使用,尤其是不能够看做主键使用。对行的任何更新都会改变 timestamp 值,从而改变键值。假设该列属于主键,那么旧的键值将对事情没有什么益处,进而引用该旧值的外键也将不再有效。固然该表在动态游标中引用,则持有更新均会变动游标中央银行的岗位。要是该列属于索引键,则对数据行的持有更新还将导致索引更新。

运用某一行中的 timestamp 列能够很简单地分明该行中的任何值自上次读取以往是不是产生了变更。即使对行实行了变更,就会更新该时间戳值。若是没有对行举行改动,则该时间戳值将与从前读取该行时的时辰戳值一致。若要重返数据库的此时此刻岁月戳值,请使用 @@DBTS。

 2.时间戳的坚守

在支配并发时起到作用: 
用户A/B同时打开某条记下起先工编织制,保存是可以判明时间戳,因为记录每一遍被更新时,系统都会活动爱抚时间戳,所以一旦保留时意识取出来的年华戳与数据库中的时间戳不对等,表明在那个历程中著录被更新过,那样的话能够幸免外人的立异被覆盖。

3.时刻戳的利用

简短说一下,timestamp
主即使记录该行的终极修改时间戳,注意,那一个小时戳是不得以变换为时间的,只好标注该行修改了。

有如何用啊?经常是用在数码增量更新方面,比如说,作者从该表复制数据到其余3个表,不过一旦本身想只复制更新过的,那么从最后一回创新的时候,记录最大的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。

 

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

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

 

相关文章