문제
직렬화 가능한 격리에서 RX-X 잠금을 유발하는 쿼리 쌍이 있습니다. 그러나 확장 이벤트를 사용하여 잠금 획득을 볼 때 RX-X 잠금 획득은 표시되지 않으며 해제 만됩니다. 그거 어디서 났어?
재현
내 테이블은 다음과 같습니다.
CREATE TABLE dbo.LockTest (
ID int identity,
Junk char(4)
)
CREATE CLUSTERED INDEX CX_LockTest --not unique!
ON dbo.LockTest(ID)
--preload some rows
INSERT dbo.LockTest
VALUES ('data'),('data'),('data')
내 문제 배치는 다음과 같습니다.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
이 세션에서 보유한 잠금을 확인하고 RX-X를 참조하십시오.
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
그러나 나는 또한에 확장 이벤트를 lock_acquired
하고 lock_released
. 적절한 associated_object_id에서 필터링합니다 .RX-X가 없습니다.
롤백을 실행 한 후에는 RX-X (LAST_MODE)가 출시되지 않았음에도 불구하고 릴리스되었습니다.
내가 시도한 것
확장 이벤트의 모든 잠금을 살펴 보았습니다 . 필터링은 없습니다. RX-X 잠금이 획득되지 않았습니다.
나는 또한 Profiler : 같은 결과를 시도했다.
잠금 에스컬레이션을 위해 XE를 실행했습니다.
특별히 변환을위한 XE는 없지만 최소한 U에서 X 로의 잠금 변환이 캡처되었음을 확인할 수있었습니다.
lock_acquired
또한 획득되었지만 결코 공개되지 않은 RI-N도 주목할 만하다. 현재의 가설은 여기에 설명 된대로 RX-X가 변환 잠금이라는 것 입니다. 일괄 처리에 겹치는 키 범위 잠금이있어 변환에 적합해야하지만 RX-X 잠금이 변환 테이블에 없습니다.
이 잠금은 어디에서 왔으며 확장 이벤트에서 선택되지 않는 이유는 무엇입니까?