新聞中心
SQL Server 互斥試探是一種有效的數(shù)據(jù)庫事務(wù)控制技術(shù),可以確保在同一時間,每一條記錄都只有一個客戶端可以訪問。它的實現(xiàn)原理是通過嘗試將一個特殊的“標識符”加載到每一條記錄時,如果該標識符已經(jīng)被加載,那么服務(wù)器就拒絕執(zhí)行命令。這實際上就模擬出了一個互斥鎖,防止了在同一時間同一條記錄被多個客戶端訪問。

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


咨詢
建站咨詢
