之是以要寫timestamp的随筆,是因為之前對它的了解存在誤區,so. I have to remind myself by writing this informal essay.
微軟文檔連結:https://msdn.microsoft.com/zh-cn/library/ms182776.aspx
釋義(rowversion和timestamp是一樣的好比C#裡的(String和string是一個概念 同義詞,寫法不一樣而已 ),不過微軟好像建議用 rowversion ,資料庫上操作還是有差别的暫時未深入研究,可查詢下面的超連結看看):
公開資料庫中自動生成的唯一二進制數字的資料類型。 rowversion 通常用作給表行加版本戳的機制。 存儲大小為 8 個位元組。 rowversion 資料類型隻是遞增的數字,不保留日期或時間。 若要記錄日期或時間,請使用 datetime2 資料類型。
注釋
每個資料庫都有一個計數器,當對資料庫中包含 rowversion 列的表執行插入或更新操作時,該計數器值就會增加。 此計數器是資料庫行版本。 這可以跟蹤資料庫内的相對時間,而不是時鐘相關聯的實際時間。 一個表隻能有一個 rowversion 列。 每次修改或插入包含 rowversion 列的行時,就會在 rowversion 列中插入經過增量的資料庫行版本值。 這一屬性使 rowversion 列不适合作為鍵使用,尤其是不能作為主鍵使用。 對行的任何更新都會更改行版本值,進而更改鍵值。 如果該列屬于主鍵,那麼舊的鍵值将無效,進而引用該舊值的外鍵也将不再有效。 如果該表在動态遊标中引用,則所有更新均會更改遊标中行的位置。 如果該列屬于索引鍵,則對資料行的所有更新還将導緻索引更新。
timestamp 的資料類型為 rowversion 資料類型的同義詞,并具有資料類型同義詞的行為。 在 DDL 語句,請盡量使用 rowversion 而不是 timestamp。 有關詳細資訊,請參閱資料類型同義詞 (Transact-SQL)。
Transact-SQL timestamp 資料類型不同于在 ISO 标準中定義的 timestamp 資料類型。
從上面釋義才醒悟,時間戳 和日期、時間半毛錢關系都沒有。 隻是個二進制值。哎.... timestamp 大家基本都知道用于并發控制的,但怎麼實作 怎麼操作呢。?
剩下的就不多扯了 : 讓我們看看微軟是如何介紹 timestamp的并發控制的: 補充下 查詢目前資料庫時間戳 : SELECT @@DBTS
CREATE TABLE MyTest2 (myKey int PRIMARY KEY
,myValue int, TS timestamp);
GO
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);
GO
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);
GO
DECLARE @t TABLE (myKey int);
UPDATE MyTest2
SET myValue = 2
OUTPUT inserted.myKey INTO @t(myKey)
WHERE myKey = 1
AND TS = myValue;
IF (SELECT COUNT(*) FROM @t) = 0
BEGIN
RAISERROR ('error changing row with myKey = %d'
,16 -- Severity.
,1 -- State
,1) -- myKey that was changed
END;
轉載于:https://www.cnblogs.com/SuperEirc/p/4973634.html