删除同一事务中的锁定插入?

时间:2019-02-22 08:45:44

标签: sql-server tsql

假设您有一个显式事务,该事务首先从TableA中删除数据,然后将数据插入到该表中:

<button mat-mini-fab  onclick="startRecordingSpeech()"><mat-icon>done</mat-icon></button>


function startRecordingSpeech(){
    console.log(windows);
    window.plugins.speechRecognition.isRecognitionAvailable(successCallback,errorCallback)
}

function successCallback(CallBack){
    console.log(CallBack);
}
function errorCallback(CallBack){
    console.log(CallBack);
} 

由于TableA上的锁升级,DELETE操作是否有可能获得排他锁(X),在删除完成后可能无法重新获得锁,因为事务尚未完成并且插入无法继续进行,只是无休止地等待,因为TableA已被锁定?

1 个答案:

答案 0 :(得分:0)

  

DELETE操作是否有可能获得排他锁(X)   锁定TableA上的升级,完成后无法重新锁定   删除,因为事务尚未完成并且插入无法完成   继续,只是无休止地等待,因为TableA已锁定?

如果我们不讨论诸如exchangeEventthreadpool之类的资源,而仅讨论key / rid / page / table / { {1}}资源,有database / sessions个资源用于获取锁,而不是transactions

如果您查看operations dmv,则不会看到“操作”,而将sys.dm_tran_locks定义为当前拥有此请求的request_session_id

一旦您了解了这一点,您就可以做出回应。

您在表上获得的会话Session ID,要进行进一步修改,同一会话需要X-lock(可能更细,但仍然X-lock),但是已经获得。没有任何冲突,也不需要获取X-lock

您可以通过执行如下代码来向自己证明:

lock

在这里,我首先通过从select top 1000 n, replicate('a',100) as filler into dbo.a from nums.dbo.nums; BEGIN TRAN DELETE FROM dbo.a with(tablock) WHERE n = 10; select * from sys.dm_tran_locks where resource_type <> 'DATABASE' and request_session_id = @@spid; dbcc traceon(3604, 1200, -1); INSERT INTO dbo.a SELECT top 2 n, replicate('a',100) as filler from nums.dbo.nums; dbcc traceoff(3604, 1200, -1); COMMIT TRAN 表中进行select into创建测试表,然后用Nums从中删除该表,并用tablock锁定了整个表,并检查是否它被锁定,最后我使用跟踪标记X-lock3604来打印出在进行1200时获得的所有locks,它们是:

insert

我的测试db_id是Process 60 acquiring IS lock on OBJECT: 11:565577053:0 (class bit0 ref1) result: OK Process 60 acquiring IS lock on PAGE: 11:1:5088 (class bit0 ref1) result: OK Process 60 acquiring S lock on KEY: 11:72057594039173120 (1b7fe5b8af93) (class bit0 ref1) result: OK Process 60 releasing lock on KEY: 11:72057594039173120 (1b7fe5b8af93) Process 60 acquiring S lock on KEY: 11:72057594039173120 (f03d7d8b0dcc) (class bit0 ref1) result: OK Process 60 releasing lock on KEY: 11:72057594039173120 (f03d7d8b0dcc) Process 60 releasing lock on OBJECT: 11:565577053:0 24是表11所在的数据库的db_id,因为您可以看到在执行此操作的数据库中未获取其他Nums lock。这是因为已经在insert上获取了X-lock