SQL Server中怎么實(shí)現(xiàn)時(shí)間戳功能,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。成都創(chuàng)新互聯(lián)公司擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。1.基本概念
時(shí)間戳:數(shù)據(jù)庫(kù)中自動(dòng)生成的二進(jìn)制數(shù)字,與時(shí)間和日期無(wú)關(guān)的, 通常用作給表行加版本戳的機(jī)制。存儲(chǔ)大小為 8個(gè)字節(jié)。
每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)計(jì)數(shù)器,當(dāng)對(duì)數(shù)據(jù)庫(kù)中包含 timestamp 列的表執(zhí)行插入或更新操作時(shí),該計(jì)數(shù)器值就會(huì)增加。該計(jì)數(shù)器是數(shù)據(jù)庫(kù)時(shí)間戳。這 可以跟蹤數(shù)據(jù)庫(kù)內(nèi)的相對(duì)時(shí)間,而不是時(shí)鐘相關(guān)聯(lián)的實(shí)際時(shí)間。一個(gè)表只能有一個(gè) timestamp 列。每次修改或插入包含 timestamp 列的行 時(shí),就會(huì)在 timestamp 列中插入增量數(shù)據(jù)庫(kù)時(shí)間戳值。這一屬性使 timestamp 列不適合作為鍵使用,尤其是不能作為主鍵使用。對(duì)行的任 何更新都會(huì)更改 timestamp 值,從而更改鍵值。如果該列屬于主鍵,那么舊的鍵值將無(wú)效,進(jìn)而引用該舊值的外鍵也將不再有效。如果該表在動(dòng)態(tài)游標(biāo) 中引用,則所有更新均會(huì)更改游標(biāo)中行的位置。如果該列屬于索引鍵,則對(duì)數(shù)據(jù)行的所有更新還將導(dǎo)致索引更新。
使用某一行中的 timestamp 列可以很容易地確定該行中的任何值自上次讀取以后是否發(fā)生了更改。如果對(duì)行進(jìn)行了更改,就會(huì)更新該時(shí)間戳值。如果沒有對(duì)行進(jìn)行更改,則該時(shí)間戳值將與以前讀取該行時(shí)的時(shí)間戳值一致。若要返回?cái)?shù)據(jù)庫(kù)的當(dāng)前時(shí)間戳值,請(qǐng)使用 @@DBTS。
2.時(shí)間戳的作用
在控制并發(fā)時(shí)起到作用:
用戶A/B同時(shí)打開某條記錄開始編輯,保存是可以判斷時(shí)間戳,因?yàn)橛涗浢看伪桓聲r(shí),系統(tǒng)都會(huì)自動(dòng)維護(hù)時(shí)間戳,所以如果保存時(shí)發(fā)現(xiàn)取出來(lái)的時(shí)間戳與數(shù)據(jù)庫(kù)中的時(shí)間戳不相等,說(shuō)明在這個(gè)過(guò)程中記錄被更新過(guò),這樣的話可以防止別人的更新被覆蓋。
3.時(shí)間戳的應(yīng)用
簡(jiǎn)單說(shuō)一下,timestamp 主要是記錄該行的最后修改時(shí)間戳,注意,這個(gè)時(shí)間戳是不可以轉(zhuǎn)換為時(shí)間的,只能標(biāo)注該行修改了。
有 什么用呢?通常是用在數(shù)據(jù)增量更新方面,比如說(shuō),我從該表復(fù)制數(shù)據(jù)到另外一個(gè)表,但是如果我想只復(fù)制更新過(guò)的,那么從最后一次更新的時(shí)候,記錄較大的 timestamp的值,然后在當(dāng)前更新的時(shí)候,只要where條件找出大于最后一次更新的 timestamp 值的所有行。然后抽取到更新過(guò)的數(shù)據(jù),進(jìn)行復(fù)制到另外一個(gè)服務(wù)器,這就是增量更新用到的。
4.在SQL中的應(yīng)用例子
(微軟的建議 -- timestamp 語(yǔ)法已被取代,在 DDL 語(yǔ)句,請(qǐng)盡量使用 rowversion 而不是 timestamp。未來(lái)的 Microsoft SQL Server 版本將移除這項(xiàng)功能。
參見/tupian/20230522/ 就是timestamp
丟失更新的解決方法如下:
丟失更新概念:當(dāng)用戶同時(shí)修改一行數(shù)據(jù),他們先讀取數(shù)據(jù),放在前端進(jìn)行修改,當(dāng)修改后,再提交數(shù)據(jù),這樣最后提交的數(shù)據(jù)會(huì)覆蓋先前提交的數(shù)據(jù),這樣就造成了丟失更新。
長(zhǎng)話短說(shuō),介紹防止丟失更新的方法: 使用rowversion 時(shí)間戳。每次更新的時(shí)候,mssql都會(huì)自動(dòng)的更新rowversion的值,若一行在讀前與更新前的值前后不一致,就說(shuō)明有其他的事務(wù)更新了此列,這樣就可以不更新此列,從而防止了丟失更新的情況。
例子 :
先創(chuàng)建一個(gè)表:
declare table tmp(a varchar(10),b rowsversion)insert into tmp(a) values( 'abc')
事務(wù)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
事務(wù)B: (再新建查詢 執(zhí)行下列代碼)
declare @rv rowversionselect @rv=b from tmp where a='abc'update tmp set a='aaa' where b=@rvgo
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。