다음을 통해 공유


sp_getapplock(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

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

Transact-SQL 구문 표기 규칙

구문

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

인수

[ @Resource = ] N'리소스'

잠금 리소스를 식별하는 이름을 지정하는 문자열입니다. @Resource 기본값NULL인 nvarchar(255)입니다. 리소스 문자열이 nvarchar(255)보다 긴 경우 값은 nvarchar(255)로 잘립니다.

애플리케이션은 리소스 이름이 고유한지 확인해야 합니다. 지정된 이름은 SQL Server 잠금 관리자에 저장할 수 있는 값으로 내부적으로 해시됩니다.

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

참고 항목

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

[ @LockMode = ] 'LockMode'

특정 리소스에 대해 가져올 잠금 모드입니다. @LockMode 기본값이 없는 varchar(32)이며 다음 값 중 하나입니다.

  • Shared
  • Update
  • IntentShared
  • IntentExclusive
  • Exclusive

자세한 내용은 잠금 모드를 참조 하세요.

[ @LockOwner = ] 'LockOwner'

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

[ @LockTimeout = ] LockTimeout

잠금 제한 시간 값(밀리초)입니다. @LockTimeout int이고 기본값은 .에서 반환@@LOCK_TIMEOUT한 값과 동일합니다. 값 -1 (기본값)은 제한 시간(즉, 영원히 대기)을 나타내지 않습니다. 요청을 즉시 부여할 수 없는 경우 잠금 요청이 잠금을 기다리는 대신 반환 코드를 -1 반환해야 함을 나타내려면 다음을 지정합니다 0.

[ @DbPrincipal = ] N'DbPrincipal'

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

반환 코드 값

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

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

설명

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

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

  • 해당 잠금 리소스를 포함하고 있는 데이터베이스의 ID
  • @DbPrincipal 매개 변수에 지정된 데이터베이스 보안 주체입니다.
  • @Resource 매개 변수에서 지정한 잠금 이름

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

잠금은 .를 사용하여 sp_releaseapplock명시적으로 해제할 수 있습니다. 애플리케이션이 동일한 잠금 리소스 sp_releaseapplock 에 대해 여러 번 호출 sp_getapplock 하는 경우 잠금을 해제하려면 동일한 횟수만큼 호출해야 합니다. 잠금 소유자가 잠금을 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 역할의 멤버 자격이 필요합니다.

예제

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

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;

DECLARE @result INT;

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

COMMIT TRANSACTION;
GO

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

BEGIN TRANSACTION;

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

COMMIT TRANSACTION;
GO