假设您有一个显式事务,该事务首先从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已被锁定?
答案 0 :(得分:0)
DELETE操作是否有可能获得排他锁(X) 锁定TableA上的升级,完成后无法重新锁定 删除,因为事务尚未完成并且插入无法完成 继续,只是无休止地等待,因为TableA已锁定?
如果我们不讨论诸如exchangeEvent
和threadpool
之类的资源,而仅讨论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-lock
,3604
来打印出在进行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
。