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。  添加数据 如高并发的情况下 时间戳会相同吗 是肯定会相同的,如果你的并发在一秒内有多条信息插入,那么时间戳肯定会相同 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

SQL Server for Linux 下一版本的公共预览

当微软宣布即将发布SQL Server for Linux版本的时候,有些人觉得很兴奋,有些人觉得然并卵,但是既然Gartner在2016年的数据库管理系统魔...

35090
来自专栏散尽浮华

Mysql占用过高CPU时的优化手段

Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑: 1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条...

1.2K120
来自专栏蓝天

Mysql 大数据量导入程序

网络上转载许多都有错误,请注意代码的规范和正确性。 经测试以下代码是正确无错的,转载请保留版权,尊重程序作者!

15920
来自专栏数据库

SQL Server数据库介绍

1、数据库基本概念 数据:描述事物的符号 数据表:由记录(行)和字段(列)组成 数据库:数据表的集合 数据库管理系统:对数据库进行管理和维护DBMS 数据库管理...

27160
来自专栏PHP在线

SQL语句执行过程详解

一条sql,plsql的执行到底是怎样执行的呢? 一、SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行 select 语句时,客户...

65560
来自专栏决胜机器学习

《高性能MySQL》读书笔记(二) ——MySQL存储引擎概述

《高性能MySQL》读书笔记(二)——MySQL存储引擎概述 (原创内容,转载请注明来源,谢谢) 一、基础信息 mysql将数据库保存在数据目录下...

41150
来自专栏小俊博客

Linux解决内存不足-添加SWAP交换分区

52820
来自专栏地方网络工作室的专栏

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用 在前面我用 python 脚本实现的 cli 版本...

28950
来自专栏码神联盟

数据库 | MYSQL 中的视图view详解

序本文目录 什么是视图 视图的特性 视图的作用 视图使用场景 视图示例1-创建、查询 视图示例2-增、删、改 其它 1什么是视图 视图是一个虚拟表,其内容由查询...

477110
来自专栏散尽浮华

Mysql优化系列(0)--总结性梳理

对于一个网站来说,在运行很长一段时间后,数据库瓶颈问题会越来越暴露出来。作为运维人员,对数据库做必要的优化十分重要! 下面总结以往查阅到的以及自己工作中的一些优...

22780

扫码关注云+社区

领取腾讯云代金券