主頁 > 知識庫 > SQL Server時間戳功能與用法詳解

SQL Server時間戳功能與用法詳解

熱門標簽:電銷需要外呼系統(tǒng)嗎 千呼電話機器人可以試用嗎 我要地圖標注數(shù)量有限制嗎 家庭農(nóng)場地圖標注名稱怎樣起名 互聯(lián)網(wǎng)電話外呼系統(tǒng) 電話機器人怎么代理商 400電話辦理泰安 零成本地圖標注賺錢 安卡拉地圖標注app

本文實例講述了SQL Server時間戳功能與用法。分享給大家供大家參考,具體如下:

一直對時間戳這個概念比較模糊,相信有很多朋友也都會誤認為:時間戳是一個時間字段,每次增加數(shù)據(jù)時,填入當前的時間值。其實這誤導了很多朋友。

1.基本概念

時間戳:數(shù)據(jù)庫中自動生成的唯一二進制數(shù)字,與時間和日期無關的, 通常用作給表行加版本戳的機制。存儲大小為 8個字節(jié)。

每個數(shù)據(jù)庫都有一個計數(shù)器,當對數(shù)據(jù)庫中包含 timestamp 列的表執(zhí)行插入或更新操作時,該計數(shù)器值就會增加。該計數(shù)器是數(shù)據(jù)庫時間戳。這 可以跟蹤數(shù)據(jù)庫內(nèi)的相對時間,而不是時鐘相關聯(lián)的實際時間。一個表只能有一個 timestamp 列。每次修改或插入包含 timestamp 列的行 時,就會在 timestamp 列中插入增量數(shù)據(jù)庫時間戳值。這一屬性使 timestamp 列不適合作為鍵使用,尤其是不能作為主鍵使用。對行的任 何更新都會更改 timestamp 值,從而更改鍵值。如果該列屬于主鍵,那么舊的鍵值將無效,進而引用該舊值的外鍵也將不再有效。如果該表在動態(tài)游標 中引用,則所有更新均會更改游標中行的位置。如果該列屬于索引鍵,則對數(shù)據(jù)行的所有更新還將導致索引更新。

使用某一行中的 timestamp 列可以很容易地確定該行中的任何值自上次讀取以后是否發(fā)生了更改。如果對行進行了更改,就會更新該時間戳值。如果沒有對行進行更改,則該時間戳值將與以前讀取該行時的時間戳值一致。若要返回數(shù)據(jù)庫的當前時間戳值,請使用 @@DBTS。

2.時間戳的作用

在控制并發(fā)時起到作用:

用戶A/B同時打開某條記錄開始編輯,保存是可以判斷時間戳,因為記錄每次被更新時,系統(tǒng)都會自動維護時間戳,所以如果保存時發(fā)現(xiàn)取出來的時間戳與數(shù)據(jù)庫中的時間戳不相等,說明在這個過程中記錄被更新過,這樣的話可以防止別人的更新被覆蓋。

3.時間戳的應用

簡單說一下,timestamp 主要是記錄該行的最后修改時間戳,注意,這個時間戳是不可以轉換為時間的,只能標注該行修改了。

有 什么用呢?通常是用在數(shù)據(jù)增量更新方面,比如說,我從該表復制數(shù)據(jù)到另外一個表,但是如果我想只復制更新過的,那么從最后一次更新的時候,記錄最大的 timestamp的值,然后在當前更新的時候,只要where條件找出大于最后一次更新的 timestamp 值的所有行。然后抽取到更新過的數(shù)據(jù),進行復制到另外一個服務器,這就是增量更新用到的。

4.在SQL中的應用例子

(微軟的建議 -- timestamp 語法已被取代,在 DDL 語句,請盡量使用 rowversion 而不是 timestamp。未來的 Microsoft SQL Server 版本將移除這項功能。

參見http://msdn.microsoft.com/zh-cn/library/ms182776.aspx)

rowversion 就是timestamp

丟失更新的解決方法如下:

丟失更新概念:當用戶同時修改一行數(shù)據(jù),他們先讀取數(shù)據(jù),放在前端進行修改,當修改后,再提交數(shù)據(jù),這樣最后提交的數(shù)據(jù)會覆蓋先前提交的數(shù)據(jù),這樣就造成了丟失更新。

長話短說,介紹防止丟失更新的方法: 使用rowversion 時間戳。
每次更新的時候,mssql都會自動的更新rowversion的值,若一行在讀前與更新前的值前后不一致,就說明有其他的事務更新了此列,這樣就可以不更新此列,從而防止了丟失更新的情況。

例子 :

先創(chuàng)建一個表:

declare table tmp(a varchar(10),b rowsversion)
insert into tmp(a) values( 'abc') 

事務A:(新建查詢   執(zhí)行下列代碼)

declare @rv rowversion
select @rv=b from tmp where a='abc'
waitfor delay '00:00:05' --休息5秒
update tmp set a='xyz' where b=@rv
go

事務B: (再新建查詢   執(zhí)行下列代碼)

declare @rv rowversion
select @rv=b from tmp where a='abc'
update tmp set a='aaa' where b=@rv
go

事務A在執(zhí)行完畢后會發(fā)現(xiàn)并沒有將'aaa'給抹去,這樣就防止了丟失更新的現(xiàn)象。

PS:關于時間戳這里再為大家提供一個Unix時間戳在線轉換工具,附帶了關于Unix時間戳的說明,以及Java、Javascript、MySQL、SQL Server、PostgreSQL、PHP等程序設計語言及數(shù)據(jù)庫的時間戳使用技巧:

Unix時間戳(timestamp)轉換工具:
http://tools.jb51.net/code/unixtime

更多關于SQL Server相關內(nèi)容感興趣的讀者可查看本站專題:《SQL Server存儲過程技巧大全》、《SQL Server查詢操作技巧大全》、《SQL Server索引操作技巧大全》、《SQL Server分頁技術總結》及《SQL Server常用函數(shù)匯總》

希望本文所述對大家SQL Server數(shù)據(jù)庫程序設計有所幫助。

您可能感興趣的文章:
  • 詳解MySQL日期 字符串 時間戳互轉
  • MySQL中日期和時間戳互相轉換的函數(shù)和方法
  • C#更新SQLServer中TimeStamp字段(時間戳)的方法
  • ms sql server中實現(xiàn)的unix時間戳函數(shù)(含生成和格式化,可以和mysql兼容)
  • mysql之TIMESTAMP(時間戳)用法詳解
  • sqlite時間戳轉時間語句(時間轉時間戳)
  • PHP+Mysql日期時間如何轉換(UNIX時間戳和格式化日期)
  • FROM_UNIXTIME 格式化MYSQL時間戳函數(shù)
  • mysql時間戳轉成常用可讀時間格式的兩種方法
  • PostgreSQL更新表時時間戳不會自動更新的解決方法

標簽:來賓 大同 濱州 文山 新鄉(xiāng) 池州 黃山 東營

巨人網(wǎng)絡通訊聲明:本文標題《SQL Server時間戳功能與用法詳解》,本文關鍵詞  SQL,Server,時間,戳,功能,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Server時間戳功能與用法詳解》相關的同類信息!
  • 本頁收集關于SQL Server時間戳功能與用法詳解的相關信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章