SQL基础之 时间戳

摘要:
每次修改或插入包含时间戳列的行时,都会将增量数据库时间戳值插入到时间戳列中。Microsoft SQL Server的未来版本将删除此功能。不建议以这种方式使用时间戳。

本文转载: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

 

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

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

免责声明:文章转载自《SQL基础之 时间戳》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity 场景分页插件 World Streamer 支持无限大地图的解决方案(一)ios文件读取下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据库SQL优化大总结之 百万级数据库优化方案(转载)

网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。   一、百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 o...

QueryWrapper获取另一个表的字段

QueryWrapper<StFloodcollR> queryWrapper = new QueryWrapper<>(); queryWrapper.select("*,(SELECT u1.real_name FROM `user` u1 WHERE CREATEDBY = u1.id ) AS creat...

Java String类型数据的字节长度

转载:http://blog.csdn.net/a19881029/article/details/7902701 问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校 验,如果数据是纯英文,没有问题,但是如果数据中包含中文,校验可以通过,但是在数据入...

类别联动下拉菜单

适用范围:省市无限级联动,商品类别无限极联动 需要使用到的jQuery插件为cxselect,ok说不清楚,还是直接上代码比较直观 HTML代码如下: <div id="element_id" class="formControls col-xs-8 col-sm-9"> <select class="select1" id=...

Sqlite(数据库)

       1.Sqlite数据类型:NULL. 空值、INTEGER. 整型、REAL.浮点型、TEXT.文本类型、BLOB. 二进制类型,用来存储文件,比如图片       2.使用sqlite3需要先导入libsqlite3.dylib并导入主头文件       3. 设置数据库文件存放路径,如沙盒的Doucuments文件夹内       NSS...

利用Python操作MySQL数据库

前言 在工作中,我们需要经常对数据库进行操作,比如 Oracle、MySQL、SQL Sever 等,今天我们就学习如何利用Python来操作 MySQL 数据库。 本人环境:Python 3.7.0 、MySQL 5.7 安装第三方库 使用Python来操作MySQL,需要用到 PyMySQL 这个第三方库,具体安装如下: pip install PyM...