SQL Server中怎么實現(xiàn)時間戳功能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)主營瀘縣網站建設的網絡公司,主營網站建設方案,重慶App定制開發(fā),瀘縣h5微信小程序搭建,瀘縣網站營銷推廣歡迎瀘縣等地區(qū)企業(yè)咨詢
1.基本概念
時間戳:數(shù)據(jù)庫中自動生成的唯一二進制數(shù)字,與時間和日期無關的, 通常用作給表行加版本戳的機制。存儲大小為 8個字節(jié)。
每個數(shù)據(jù)庫都有一個計數(shù)器,當對數(shù)據(jù)庫中包含 timestamp 列的表執(zhí)行插入或更新操作時,該計數(shù)器值就會增加。該計數(shù)器是數(shù)據(jù)庫時間戳。這 可以跟蹤數(shù)據(jù)庫內的相對時間,而不是時鐘相關聯(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 rowversionselect @rv=b from tmp where a='abc'waitfor delay '00:00:05' --休息5秒update tmp set a='xyz' where b=@rvgo
事務B: (再新建查詢 執(zhí)行下列代碼)
declare @rv rowversionselect @rv=b from tmp where a='abc'update tmp set a='aaa' where b=@rvgo
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。