Вторая транзакция остается в ожидании после завершения первой - PullRequest
0 голосов
/ 07 февраля 2019

Запуск одного и того же скрипта в двух окнах в SSMS одно за другим с задержкой в ​​пару секунд.
Второй экземпляр, который я запускаю позже, завершается, но первый остается заблокированным, пока я не закрою второе окно.Что здесь происходит?Почему он не снимает блокировку после COMMIT?

SET TRAN ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

SELECT * FROM dbo.t1
WHERE id IN (1,3)

WAITFOR DELAY '00:00:20'

UPDATE t1 SET InUse=0
WHERE id IN (1,3)

COMMIT

Редактировать:

Структура таблицы выглядит следующим образом:

CREATE TABLE [dbo].[t1](
    [id] [INT] NOT NULL,
    [InUse] [BIT] NOT NULL DEFAULT ((0)),
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

1 Ответ

0 голосов
/ 07 февраля 2019

Вы должны обновить свой вопрос с помощью структуры таблицы.

Поскольку вы не указали, есть ли на вашей таблице какой-либо индекс, я предполагаю, что ее нет, т. Е. dbo.t1 - это heap.

В этом случае вы получите классический deadlock:

session1, который хочет select из таблицы и нуждается в S для любой строки, которую он читает, и потому что * 1013 нет* на dbo.t1 вся таблица считывается, а S-lock на столе сохраняется на протяжении всей транзакции.

В то же время session2 делает то же самое и также получает S-lock натаблица и держит его.

Session1 теперь необходимо преобразовать его S-lock в IX, чтобы сделать update, и он заблокирован session2, который содержит S на dbo.t1.

Когда session2 пытается сделать то же самое, это приводит к взаимоблокировке, потому что оба сеанса нуждаются в IX и оба заблокированы другим сеансом.

Вот соответствующий график взаимоблокировки:

deadlock-list
 deadlock victim=process155d1d498
  process-list
   process id=process155d1d498 taskpriority=0 logused=0 waitresource=OBJECT: 26:1765581328:0  waittime=16222 ownerId=5528849 transactionname=user_transaction lasttranstarted=2019-02-07T13:39:38.837 XDES=0x15ec1c3a8 lockMode=IX schedulerid=4 kpid=8140 status=suspended spid=54 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2019-02-07T13:39:38.833 lastbatchcompleted=2019-02-07T13:39:38.833 lastattention=2019-02-07T13:38:49.187 clientapp=Microsoft SQL Server Management Studio - Query hostname=pppp hostpid=12276 loginname=FINCONSGROUP\anna.savchenko isolationlevel=serializable (4) xactid=5528849 currentdb=26 lockTimeout=4294967295 clientoption1=671098976 clientoption2=390200
    executionStack
     frame procname=adhoc line=9 stmtstart=248 stmtend=334 sqlhandle=0x02000000f445021276fec0f5ec119082f65611ce316a4d280000000000000000000000000000000000000000
UPDATE t1 SET InUse=0
WHERE id IN (1,3)     
    inputbuf
SET TRAN ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM dbo.t1
WHERE id IN (1,3)
WAITFOR DELAY '00:00:20'
UPDATE t1 SET InUse=0
WHERE id IN (1,3)
COMMIT
   process id=process15649f868 taskpriority=0 logused=0 waitresource=OBJECT: 26:1765581328:0  waittime=1212 ownerId=5529084 transactionname=user_transaction lasttranstarted=2019-02-07T13:39:53.847 XDES=0x15ec1d048 lockMode=IX schedulerid=3 kpid=15516 status=suspended spid=57 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2019-02-07T13:39:53.847 lastbatchcompleted=2019-02-07T13:39:53.847 lastattention=1900-01-01T00:00:00.847 clientapp=Microsoft SQL Server Management Studio - Query hostname=pppp hostpid=12276 loginname=FINCONSGROUP\anna.savchenko isolationlevel=serializable (4) xactid=5529084 currentdb=26 lockTimeout=4294967295 clientoption1=671098976 clientoption2=390200
    executionStack
     frame procname=adhoc line=9 stmtstart=248 stmtend=334 sqlhandle=0x0200000093b3ba1c08d586d1f142f473a7c8996074a369fc0000000000000000000000000000000000000000
UPDATE t1 SET InUse=0
WHERE id IN (1,3)     
    inputbuf
SET TRAN ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SELECT * FROM dbo.t1
WHERE id IN (1,3)
WAITFOR DELAY '00:00:20'
UPDATE t1 SET InUse=0
WHERE id IN (1,3)
COMMIT    
  resource-list
   objectlock lockPartition=0 objid=1765581328 subresource=FULL dbid=26 objectname=parts.dbo.t1 id=lock152c2d300 mode=S associatedObjectId=1765581328
    owner-list
     owner id=process15649f868 mode=S
     owner id=process15649f868 mode=IX requestType=convert
    waiter-list
     waiter id=process155d1d498 mode=IX requestType=convert
   objectlock lockPartition=0 objid=1765581328 subresource=FULL dbid=26 objectname=parts.dbo.t1 id=lock152c2d300 mode=S associatedObjectId=1765581328
    owner-list
     owner id=process155d1d498 mode=S
     owner id=process155d1d498 mode=IX requestType=convert
    waiter-list
     waiter id=process15649f868 mode=IX requestType=convert
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...