程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server時光戳功效與用法詳解

SQL Server時光戳功效與用法詳解

編輯:MSSQL

SQL Server時光戳功效與用法詳解。本站提示廣大學習愛好者:(SQL Server時光戳功效與用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server時光戳功效與用法詳解正文


本文實例講述了SQL Server時光戳功效與用法。分享給年夜家供年夜家參考,詳細以下:

一向對時光戳這個概念比擬隱約,信任有許多同伙也都邑誤以為:時光戳是一個時光字段,每次增長數據時,填入以後的時光值。其實這誤導了許多同伙。

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)

rowversion 就是timestamp

喪失更新的處理辦法以下:

喪失更新概念:當用戶同時修正一行數據,他們先讀取數據,放在前端停止修正,當修正後,再提交數據,如許最初提交的數據會籠罩先條件交的數據,如許就形成了喪失更新。

長話短說,引見避免喪失更新的辦法: 應用rowversion 時光戳。
每次更新的時刻,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' --歇息5秒
update tmp set a='xyz' where b=@rv
go

事務B: (再新建查詢   履行以下代碼)

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

事務A在履行終了後會發明並未將'aaa'給抹去,如許就避免了喪失更新的景象。

PS:關於時光戳這裡再為年夜家供給一個Unix時光戳在線轉換對象,附帶了關於Unix時光戳的解釋,和Java、Javascript、MySQL、SQL Server、PostgreSQL、PHP等法式設計說話及數據庫的時光戳應用技能:

Unix時光戳(timestamp)轉換對象:
http://tools.jb51.net/code/unixtime

願望本文所述對年夜家SQL Server數據庫法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved