十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
SQL Server 互斥試探是一種有效的數(shù)據(jù)庫(kù)事務(wù)控制技術(shù),可以確保在同一時(shí)間,每一條記錄都只有一個(gè)客戶端可以訪問(wèn)。它的實(shí)現(xiàn)原理是通過(guò)嘗試將一個(gè)特殊的“標(biāo)識(shí)符”加載到每一條記錄時(shí),如果該標(biāo)識(shí)符已經(jīng)被加載,那么服務(wù)器就拒絕執(zhí)行命令。這實(shí)際上就模擬出了一個(gè)互斥鎖,防止了在同一時(shí)間同一條記錄被多個(gè)客戶端訪問(wèn)。

然而,互斥試探并不是沒(méi)有局限性。最顯著的一個(gè)局限性是當(dāng)特殊“標(biāo)識(shí)符”在試探的時(shí)候被多線程加載的情況,這時(shí),服務(wù)器就無(wú)法分辨,使客戶端無(wú)法保證互斥性。
為了解決這個(gè)問(wèn)題,我們可以使用atomi_test_and_set 函數(shù)及 SQL Server _interlock 內(nèi)置函數(shù)。這兩個(gè)函數(shù)都可以對(duì)指定的變量產(chǎn)生原子級(jí)的讀取和設(shè)置操作,這樣就能有效的建立互斥從而保證客戶端的互斥性。
以下是一個(gè)使用 atomi_test_and_set函數(shù) 實(shí)現(xiàn)SQL Server互斥試探的示例:
DECLARE @val INT
— 嘗試把 @val 設(shè)置為-1
SET @val = atomic_test_and_set(-1);
— 如果@val 不等于-1,說(shuō)明其它客戶端已經(jīng)訪問(wèn)此記錄了
IF(@val!=-1)
BEGIN
RAISERROR (‘The record is already accessed by other clients’, 16, 1);
END
ELSE
BEGIN
— 訪問(wèn)資源,這里可以放置你的代碼……
— 完成任務(wù)后,客戶端直接解除@val 的鎖
SET @val = atomic_test_and_set(0);
END
以下是使用 _ interlock 內(nèi)置函數(shù)實(shí)現(xiàn)SQL Server互斥試探的示例:
DECLARE @val INT
— 獲取變量 @val 的值
SET @val = _Interlock(3, 0);
— 如果 @val 的值不等于0,說(shuō)明其它客戶端已經(jīng)訪問(wèn)此記錄
IF(@val!=0)
BEGIN
RAISERROR (‘The record is already accessed by other clients’, 16, 1);
END
ELSE
BEGIN
— 訪問(wèn)資源,這里可以放置你的代碼……
— 完成任務(wù)后,客戶端直接解除@val 的鎖
SET @val = _Interlock(1, 0);
END
從上面的示例可以看出,使用atomi_test_and_set / _interlock 函數(shù)來(lái)實(shí)現(xiàn)SQL Server互斥試探的實(shí)現(xiàn)原理,大大簡(jiǎn)化了對(duì)記錄的互斥訪問(wèn),因此,可以有效的防止記錄被多個(gè)客戶端訪問(wèn),并確保了數(shù)據(jù)的完整性。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。