一直對時間戳這個概念比較模糊,相信有很多朋友也都會誤認為:時間戳是乙個時間字段,每次增加資料時,填入當前的時間值。其實這誤導了很多朋友。
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 版本將移除這項功能
。
參見
rowversion就是timestamp
丟失更新的解決方如下
丟失更新概念:當使用者同時修改一行資料,他們先讀取資料,放在前端進行修改,當修改後,再提交資料,這樣最後提交的資料會覆蓋先前提交的資料,
這樣就造成了丟失更新。
長話短說,介紹防止丟失更新的方法: 使用rowversion時間戳。
每次更新的時候,mssql都會自動的更新rowversion的值,若一行在讀前與更新前的值前後不一致,就說明有其他的事務更新了此列,這樣就可以不更新此列,
從而防止了丟失更新的情況。
例子 :
先建立乙個表:
declare table tmp(a varchar(10),b rowsversion)insert into tmp(a) values( 'abc')
事務a:(新建查詢 執行下列**)
declare @rv rowversionselect @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 rowversionselect @rv=b from tmp where a='abc'
update tmp set a='aaa' where b=@rv
go
事務a在執行完畢後會發現並沒有將'aaa'給抹去,這樣就防止了丟失更新的現象。
**:
SQL時間戳的使用
一直對時間戳這個概念比較模糊,相信有很多朋友也都會誤認為 時間戳是乙個時間字段,每次增加資料時,填入當前的時間值。其實這誤導了很多朋友。1.基本概念 時間戳 資料庫中自動生成的唯一二進位制數字,與時間和日期無關的,通常用作給錶行加版本戳的機制。儲存大小為 8個位元組。每個資料庫都有乙個計數器,當對資...
SQL的時間戳日期時間轉換
將時間戳轉換為日期格式 比如降1455504268 2016 02 15 10 44 28 1 select device.register time a,from unixtime device.register time,y m d h i s as registertime from tm d...
Python時間戳的使用
1.將字串的時間轉換為時間戳 方法 a 2013 10 10 23 40 00 將其轉換為時間陣列 importtime timearray time.strptime a,y m d h m s 轉換為時間戳 timestamp int time.mktime timearray timestam...