sp_getapplock sp_getapplock - 北京怡康軟件科技有限公司 資源網(wǎng) "/>
鎖定應(yīng)用程序資源。
sp_getapplock [ @Resource = ] 'resource_name',
[ @LockMode = ] 'lock_mode'
[ , [ @LockOwner = ] 'lock_owner' ]
[ , [ @LockTimeout = ] 'value' ]
[@Resource =] 'resource_name'
由客戶端應(yīng)用程序指定的鎖資源名稱。應(yīng)用程序必須確保資源的唯一性。指定名稱經(jīng)過內(nèi)部哈希計(jì)算后成為可以存儲(chǔ)在 SQL Server 鎖管理器中的值,resource name 的數(shù)據(jù)類型為 nvarchar(255),沒有默認(rèn)值。
[@LockMode =] 'lock_mode'
鎖模式。lock_mode 的數(shù)據(jù)類型為 nvarchar(32),沒有默認(rèn)值,它可以為下列值之一:Shared、Update、Exclusive、IntentExclusive、IntentShared。
[@LockOwner =] 'lock_owner'
是鎖的所有者。lock_owner 的數(shù)據(jù)類型為 nvarchar(32),并且可以是 Transaction(默認(rèn)值)或 Session。當(dāng) lock_owner 值為默認(rèn)值或當(dāng)顯式地指定 Transaction 時(shí),則必須從事務(wù)內(nèi)執(zhí)行 sp_getapplock。
[@LockTimeout =] 'value'
鎖超時(shí)值,以毫秒為單位。默認(rèn)值與 @@LOCK_TIMEOUT 返回的值相同。若要指定對(duì)于不能立即授予的鎖請(qǐng)求應(yīng)返回一個(gè)錯(cuò)誤,而不應(yīng)等待鎖,請(qǐng)指定 0。
>= 0(成功)或 <= 0(失?。?/P>
Value | 結(jié)果 |
---|---|
0 | 鎖已同時(shí)成功授予。 |
1 | 在等待釋放其它不兼容鎖后成功授予鎖。 |
-1 | 鎖請(qǐng)求超時(shí)。 |
-2 | 鎖請(qǐng)求被取消。 |
-3 | 選擇鎖請(qǐng)求作為死鎖犧牲品。 |
-999 | 參數(shù)驗(yàn)證或其它調(diào)用錯(cuò)誤。 |
在資源上設(shè)置的鎖與當(dāng)前事務(wù)或當(dāng)前會(huì)話相關(guān)聯(lián)。當(dāng)事務(wù)提交或回滾時(shí),將釋放與當(dāng)前事務(wù)相關(guān)聯(lián)的鎖。當(dāng)會(huì)話注銷時(shí),將釋放與會(huì)話相關(guān)聯(lián)的鎖。服務(wù)器因任何原因而關(guān)閉時(shí),都將釋放鎖。
可以使用 sp_releaseapplock 顯式釋放鎖。如果應(yīng)用程序?yàn)橥绘i資源多次調(diào)用 sp_getapplock,則必須調(diào)用同樣次數(shù)的 sp_releaseapplock 來釋放鎖。
如果為同一鎖資源多次調(diào)用 sp_getapplock,但是指定了不同的鎖模式,則對(duì)資源的影響將是兩個(gè)鎖模式的聯(lián)合。多數(shù)情況下,這意味著將鎖模式提升為現(xiàn)有模式和新請(qǐng)求模式中更強(qiáng)的模式。即使出現(xiàn)鎖釋放調(diào)用,也會(huì)把持這一更強(qiáng)的模式直到最終釋放鎖。例如,在以下調(diào)用順序中,將以排它模式而非共享模式控制資源。
USE Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared'
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Exclusive'
EXEC @result = sp_releaseapplock @Resource = 'Form1'
COMMIT TRAN
如果應(yīng)用程序鎖發(fā)生死鎖,則該死鎖不會(huì)回滾請(qǐng)求此應(yīng)用程序鎖的事務(wù)。必須手工完成任何可能導(dǎo)致返回值的潛在請(qǐng)求的回滾。因此,建議在代碼中使用錯(cuò)誤檢查,如果返回某些值(例如 -3),則啟動(dòng) ROLLBACK TRANSACTION 或選擇性操作。
以下是示例:USE Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Exclusive'IF @result = '-3'
BEGIN
ROLLBACK TRAN
END
ELSE
BEGIN
EXEC @result = sp_releaseapplock @Resource = 'Form1'
COMMIT TRAN
END
SQL Server 使用當(dāng)前數(shù)據(jù)庫 ID 來限定資源。因此,如果在不同數(shù)據(jù)庫上執(zhí)行 sp_getapplock,即便使用了相同的參數(shù)值,結(jié)果仍然是在單獨(dú)資源上使用單獨(dú)鎖。
使用 sp_lock 檢查鎖信息或使用 SQL 事件探查器監(jiān)視鎖。
執(zhí)行權(quán)限默認(rèn)授予 public 角色。
下面的示例在 Northwind 數(shù)據(jù)庫中的資源"Form1"上設(shè)置共享鎖,使其與當(dāng)前事務(wù)關(guān)聯(lián)。
USE
Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
@LockMode = 'Shared'
COMMIT TRAN
相關(guān)文章