sp_getapplock(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

애플리케이션 리소스에 잠금을 배치합니다.

Transact-SQL 구문 표기 규칙

구문

  
sp_getapplock [ @Resource = ] 'resource_name' ,  
     [ @LockMode = ] 'lock_mode'   
     [ , [ @LockOwner = ] 'lock_owner' ]   
     [ , [ @LockTimeout = ] 'value' ]  
     [ , [ @DbPrincipal = ] 'database_principal' ]  
[ ; ]  

인수

[ @Resource= ] 'resource_name'
잠금 리소스를 식별하는 이름을 지정하는 문자열입니다. 애플리케이션은 리소스 이름이 고유한지 확인해야 합니다. 지정된 이름은 SQL Server 잠금 관리자에 저장할 수 있는 값으로 내부적으로 해시됩니다. resource_name 기본값이 없는 nvarchar(255)입니다. 리소스 문자열이 nvarchar(255)보다 긴 경우 nvarchar(255)로 잘립니다.

resource_name 이진 비교되므로 현재 데이터베이스의 데이터 정렬 설정에 관계없이 대/소문자를 구분합니다.

참고 항목

애플리케이션 잠금을 획득한 후에는 처음 32자만 일반 텍스트로 검색할 수 있습니다. re기본der가 해시됩니다.

[ @LockMode= ] 'lock_mode'
특정 리소스에 대해 가져올 잠금 모드입니다. lock_mode varchar(32)이며 기본값이 없습니다. 값은 공유, 업데이트, IntentShared, IntentExclusive 또는 Exclusive 중 어느 것이든 될 수 있습니다. 자세한 내용은 잠금 모드를 참조 하세요.

[ @LockOwner= ] 'lock_owner'
잠금의 소유자이며 잠금이 요청되었을 때의 lock_owner 값입니다. lock_owner varchar(32)입니다. 값은 Transaction(기본값) 또는 Session일 수 있습니다. lock_owner 값이 기본적으로 Transaction이거나 명시적으로 지정된 경우 트랜잭션 내에서 sp_getapplock 실행해야 합니다.

[ @LockTimeout= ] 'value'
잠금 제한 시간 값(밀리초)입니다. 기본값은 @@LOCK_TIMEOUT 반환된 값과 동일합니다. -1(기본값)은 제한 시간이 없음(무기한 대기)을 나타냅니다. 요청을 즉시 부여할 수 없는 경우 잠금을 기다리는 대신 잠금 요청이 -1의 반환 코드를 반환해야 함을 나타내려면 0을 지정합니다.

[ @DbPrincipal= ] 'database_principal'
데이터베이스의 개체에 대한 권한이 있는 사용자, 역할 또는 애플리케이션 역할입니다. 함수 호출자는 함수를 성공적으로 호출하려면 database_principal, dbo 또는 db_owner 고정 데이터베이스 역할의 멤버여야 합니다. 기본값은 public입니다.

반환 코드 값

>= 0(성공) 또는 < 0(실패)

결과
0 잠금이 동기적으로 부여되었습니다.
1 호환되지 않는 다른 잠금이 해제될 때까지 기다린 후 잠금이 성공적으로 부여되었습니다.
-1 잠금 요청 시간이 초과되었습니다.
-2 잠금 요청이 취소되었습니다.
-3 잠금 요청이 교착 상태에서 처리되지 않았습니다.
-999 매개 변수 유효성 검사 또는 다른 호출에서 오류가 발생하였음을 나타냅니다.

설명

리소스에 배치된 잠금은 현재 트랜잭션 또는 현재 세션과 연결됩니다. 현재 트랜잭션과 연결된 잠금은 트랜잭션이 커밋되거나 롤백될 때 해제됩니다. 세션과 연결된 잠금은 세션이 로그아웃될 때 해제됩니다. 어떤 이유로든 서버가 종료되면 모든 잠금이 해제됩니다.

sp_getapplock 만든 잠금 리소스는 세션의 현재 데이터베이스에서 만들어집니다. 각 잠금 리소스는 다음의 결합된 값으로 식별됩니다.

  • 해당 잠금 리소스를 포함하고 있는 데이터베이스의 ID

  • 매개 변수에 지정된 데이터베이스 보안 주체입니다 @DbPrincipal .

  • @Resource 매개 변수에서 지정한 잠금 이름

매개 변수에 지정된 @DbPrincipal 데이터베이스 보안 주체의 멤버만 해당 보안 주체를 지정하는 애플리케이션 잠금을 획득할 수 있습니다. dbo 및 db_owner 역할의 멤버는 암시적으로 모든 역할의 멤버로 간주됩니다.

잠금은 sp_releaseapplock 사용하여 명시적으로 해제할 수 있습니다. 애플리케이션이 동일한 잠금 리소스에 대해 sp_getapplock 여러 번 호출하는 경우 잠금을 해제하려면 sp_releaseapplock 동일한 횟수만큼 호출해야 합니다. 잠금 소유자가 잠금을 Transaction 열면 트랜잭션이 커밋되거나 롤백될 때 해당 잠금이 해제됩니다.

sp_getapplock 동일한 잠금 리소스에 대해 여러 번 호출되지만 요청 중 하나로 지정된 잠금 모드가 기존 모드와 동일하지 않은 경우 리소스에 미치는 영향은 두 잠금 모드의 결합입니다. 대부분의 경우 잠금 모드가 더 강력한 잠금 모드, 기존 모드 또는 새로 요청된 모드로 승격됨을 의미합니다. 이 더 강력한 잠금 모드는 잠금이 최종적으로 해제될 때까지 유지됩니다. 예를 들어 다음 호출 시퀀스에서 리소스는 모드가 아닌 모드로 Shared 유지 Exclusive 됩니다.

USE AdventureWorks2022;  
GO  
BEGIN TRANSACTION;  
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 TRANSACTION;  
GO  

애플리케이션을 잠그는 교착 상태가 발생해도 애플리케이션 잠금을 요청한 트랜잭션이 롤백되지 않습니다. 반환 값의 결과로 필요할 수 있는 롤백은 수동으로 수행해야 합니다. 따라서 특정 값(예: -3)이 반환될 경우 ROLLBACK TRANSACTION 또는 대체 작업이 시작되도록 오류 검사 코드에 포함하는 것이 좋습니다.

예를 들어 다음과 같습니다.

USE AdventureWorks2022;  
GO  
BEGIN TRANSACTION;  
DECLARE @result int;  
EXEC @result = sp_getapplock @Resource = 'Form1',   
               @LockMode = 'Exclusive';  
IF @result = -3  
BEGIN  
    ROLLBACK TRANSACTION;  
END  
ELSE  
BEGIN  
    EXEC @result = sp_releaseapplock @Resource = 'Form1';  
    COMMIT TRANSACTION;  
END;  
GO  

SQL Server는 현재 데이터베이스 ID를 사용하여 리소스를 한정합니다. 따라서 다른 데이터베이스에서 동일한 매개 변수 값이 있더라도 sp_getapplock 실행되는 경우 결과는 별도의 리소스에 대한 별도의 잠금입니다.

sys.dm_tran_locks 동적 관리 뷰 또는 sp_lock 시스템 저장 프로시저를 사용하여 잠금 정보를 검사하거나 SQL Server Profiler를 사용하여 잠금을 모니터링합니다.

사용 권한

public 역할의 멤버 자격이 필요합니다.

예제

다음은 현재 트랜잭션과 연결된 공유 잠금을 데이터베이스의 리소스 Form1AdventureWorks2022 에 배치하는 예제입니다.

USE AdventureWorks2022;  
GO  
BEGIN TRAN;  
DECLARE @result int;  
EXEC @result = sp_getapplock @Resource = 'Form1',   
               @LockMode = 'Shared';  
COMMIT TRAN;  
GO  

다음 예제에서는 데이터베이스 보안 주체로 지정합니다 dbo .

BEGIN TRAN;  
EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'AdventureWorks2022',   
     @LockMode = 'Shared';  
COMMIT TRAN;  
GO  

참고 항목

APPLOCK_MODE(Transact-SQL)
APPLOCK_TEST(Transact-SQL)
sp_releaseapplock(Transact-SQL)