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