다음을 통해 공유


sp_getapplock(Transact-SQL)

응용 프로그램 리소스에 잠금을 설정합니다.

항목 링크 아이콘 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자만 일반 텍스트로 검색되고 나머지는 해시됩니다.

  • [ @LockMode= ] 'lock_mode'
    특정 리소스에 대해 획득할 잠금 모드입니다. lock_mode는 nvarchar(32)이며 기본값은 없습니다. 값은 다음 중 하나일 수 있습니다. Shared, Update, IntentShared, IntentExclusive, Exclusive 중 하나일 수 있습니다.

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

  • [ @LockTimeout= ] 'value'
    잠금 제한 시간 값(밀리초)입니다. 기본값은 @@LOCK_TIMEOUT에서 반환되는 값과 같습니다. 즉시 허가할 수 없는 잠금 요청이 대기하지 않고 오류를 반환하도록 하려면 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을 호출해야 합니다.

동일 잠금 리소스에 대해 sp_getapplock을 여러 번 호출하되 요청 중 하나에서 기존 모드와 다른 잠금 모드를 지정한 경우 리소스에 두 잠금 모드를 합친 것만큼의 영향을 미칩니다. 즉, 대부분의 경우에 잠금 모드가 기존 모드 또는 새로 요청된 모드 중에서 보다 강력한 잠금 모드 수준으로 올라갑니다. 이 더욱 강력한 잠금 모드는 이전에 잠금 해제 호출이 발생한 경우에도 잠금이 궁극적으로 해제될 때까지 유지됩니다. 예를 들어 다음과 같은 호출 시퀀스에서 리소스는 Shared 모드가 아니라 Exclusive 모드에서 유지됩니다.

USE AdventureWorks2012;
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 AdventureWorks2012;
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 프로파일러를 사용하여 잠금을 모니터링할 수 있습니다.

사용 권한

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

다음 예에서는 AdventureWorks2012 데이터베이스의 Form1 리소스에 대해 현재 트랜잭션과 연관된 공유 잠금을 설정합니다.

USE AdventureWorks2012;
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 = 'AdventureWorks2012', 
     @LockMode = 'Shared';
COMMIT TRAN;
GO

참고 항목

참조

APPLOCK_MODE(Transact-SQL)

APPLOCK_TEST(Transact-SQL)

sp_releaseapplock(Transact-SQL)