Megosztás a következőn keresztül:


sp_getapplock (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Zárolja egy alkalmazási erőforrást.

Transact-SQL szintaxis konvenciók

Szemantika

sp_getapplock
    [ [ @Resource = ] N'Resource' ]
    , [ @LockMode = ] 'LockMode'
    [ , [ @LockOwner = ] 'LockOwner' ]
    [ , [ @LockTimeout = ] LockTimeout ]
    [ , [ @DbPrincipal = ] N'DbPrincipal' ]
[ ; ]

Arguments

[ @Resource = ] N'Resource'

Egy láncsor, amely megadja a nevet, amely azonosítja a zár erőforrást. @Resourcenvarchar(255), alapértelmezett értéke NULL. Ha egy erőforrás-lánc hosszabb, mint nvarchar(255), az értéket nvarchar(255)-re rövidítik.

Az alkalmazásnak biztosítania kell, hogy az erőforrás neve egyedi. A megadott név belső hashelésbe kerül egy értékbe, amely az SQL Server zárkezelőjében tárolható.

@Resource bináris összehasonlítású, így kis- és kis- detekúrós függetlenül az aktuális adatbázis összeállítási beállításaitól.

Megjegyzés:

Miután egy alkalmazási zárolást szereztek, csak az első 32 karakter lehet tiszta szövegben visszaszerezni; a maradékot összesítik.

[ @LockMode = ] 'LockMode'

A zárolási mód, amelyet egy adott erőforráshoz kell szerezni. @LockModea varchar(32), alapértelmezett nélkül, és az alábbi értékek egyike:

  • Shared
  • Update
  • IntentShared
  • IntentExclusive
  • Exclusive

További információért lásd: zárolási módok.

[ @LockOwner = ] 'LockOwner'

A zsilit tulajdonosa, ami a @LockOwner érték, amikor a zárat kérték. @LockOwnera varchar(32), alapértelmezett értéke Transaction. Az érték is lehet Session. Amikor a @LockOwner érték Transactionalapértelmezettnek vagy kifejezetten megjelölve, sp_getapplock akkor egy tranzakción belül kell végrehajtani.

[ @LockTimeout = ] LockTimeout

A zárolási időkorlát ezredmásodpercekben. @LockTimeoutint, és az alapértelmezett érték megegyezik azzal, amit a - @@LOCK_TIMEOUTnek visszaadott értéke . Az (default) érték -1 azt jelzi, hogy nincs időkorlát (azaz örökké várak). Annak jelezésére, hogy egy zárolási kérésnek vissza kell adnia a visszaküldési kódot , -1 ahelyett, hogy várnánk a zárásra, amikor a kérés nem azonnal engedélyezhető, határozd 0meg .

[ @DbPrincipal = ] N'DbPrincipal'

A felhasználó, szerep vagy alkalmazás szerep, amely egy objektumhoz tartozó jogosultságokat ad egy adatbázisban. @DbPrincipal a sysname, alapértelmezettként public. A függvény hívójának tagnak kell lennie a database_principal, dbo vagy a db_owner fix adatbázis szerepének tagjának ahhoz, hogy sikeresen hívhassuk a függvényt. Az alapértelmezett a nyilvános.

Kódértékek visszaadása

>= 0 (siker), vagy < 0 (kudarc).

Érték Result
0 A zár szinkronban sikerült megoldani.
1 A zárat sikeresen engedélyezték, miután megvárták a többi összeegyeztethetetlen zár feloldását.
-1 A zár kérése időlejárt.
-2 A zárolási kérelmet törölték.
-3 A zár kérését holtpontnak választották.
-999 Paraméter validálást vagy más hívási hibát jelez.

Megjegyzések

Az erőforrásra helyezett zárak vagy a jelenlegi tranzakcióhoz, vagy a jelenlegi üléshez kapcsolódnak. A jelenlegi tranzakcióhoz kapcsolódó zárak akkor szabadulnak fel, amikor a tranzakció elkötelezi magát vagy visszahúzódik. A zárak, amelyek a játékrészleghez kapcsolódnak, akkor szabadulnak fel, amikor a játék kijelentkezik. Ha a szerver bármilyen okból leáll, minden zár feloldódik.

A zár sp_getapplock által létrehozott zár erőforrás a jelenlegi adatbázisban jön létre az üléshez. Minden zár erőforrást az alábbi együttes értékek alapján azonosítják:

  • Az adatbázis azonosítója, amely tartalmazza a zár erőforrást.
  • Az adatbázis alapvető, amelyet a @DbPrincipal paraméterben jelöltek meg.
  • A paraméterben megadott @Resource zárnév.

Csak az @DbPrincipal paraméterben megadott adatbázis-alap tagja szerezhet alkalmazási zárokat, amelyek megadják az adott alapvetvet. A dbo és db_owner szerepek tagjai implicit módon minden szerep tagjainak számítanak.

A zárak kifejezetten feloldhatók .sp_releaseapplock Ha egy alkalmazás többször is hív sp_getapplock ugyanazt a zár erőforrást, sp_releaseapplock ugyanannyiszor kell meghívnia a zár feloldásához. Amikor a zár tulajdonosával kinyitnak Transaction , az a zár feloldódik, amikor a tranzakciót elvégezik vagy visszafordítják.

Ha sp_getapplock többször is meghívják ugyanazon zár erőforrásra, de a lekérdezésekben megadott zárolási mód nem egyezik meg a meglévő móddal, az erőforrásra gyakorolt hatása a két zárolási mód egyesülése. A legtöbb esetben ez azt jelenti, hogy a zár módot az erősebb zár módra, a meglévő módra vagy az újonnan kért módra lépik elő. Ez az erősebb zárolási mód addig tart, amíg a zár végül el nem engedik, még akkor is, ha a zárfeloldó hívások még akkor is, ha a zárfeloldó hívások még korábban is megtörténik.

Például a következő hívássorozatban az erőforrást módban Exclusive tartják, nem módban Shared .

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

EXECUTE
    @result = sp_releaseapplock
    @Resource = 'Form1';

COMMIT TRANSACTION;
GO

Egy alkalmazás-zárolással rendelkező holtpont nem fordítja vissza azt a tranzakciót, amely az alkalmazás-zárlatot kérte. A visszaküldési érték miatt szükséges visszafordítást manuálisan kell végrehajtani. Ezért javasoljuk, hogy a hibaellenőrzés is legyen benne a kódban, így ha bizonyos értékek visszakerülnek (például -3), egy ROLLBACK TRANSACTION vagy alternatív akció induljon.

Íme egy példa:

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Exclusive';

IF @result = -3
BEGIN
    ROLLBACK;
END
ELSE
BEGIN
    EXECUTE
        @result = sp_releaseapplock
        @Resource = 'Form1';
    COMMIT TRANSACTION;
END
GO

Az SQL Server a jelenlegi adatbázis azonosítót használja az erőforrás minősítésére. Ezért, ha sp_getapplock végrehajtják, még azonos paraméterértékekkel is különböző adatbázisokon az eredmény külön zárolások lesznek külön erőforrásokon.

Használd a sys.dm_tran_locks dinamikus menedzsment nézetet vagy a sp_lock rendszertárolt eljárást a zár információinak vizsgálatára, vagy SQL Server Profilerrel a zárak figyelésére.

Permissions

A nyilvános szerepkör tagságát igényli.

Példák

A következő példa egy megosztott zárat, amely a jelenlegi tranzakcióhoz kapcsolódik, helyez el az adatbázis erőforrására Form1AdventureWorks2025 .

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result AS INT;

EXECUTE
    @result = sp_getapplock
    @Resource = 'Form1',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO

A következő példa az adatbázis alapvetőként jelöli dbo meg.

BEGIN TRANSACTION;

EXECUTE sp_getapplock
    @DbPrincipal = 'dbo',
    @Resource = 'AdventureWorks2022',
    @LockMode = 'Shared';

COMMIT TRANSACTION;
GO