sp_getapplock(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
애플리케이션 리소스에 잠금을 배치합니다.
구문
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 매개 변수에 지정된 데이터베이스 보안 주체의 멤버만 해당 보안 주체를 지정하는 애플리케이션 잠금을 획득할 수 있습니다. dbo 및 db_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