2017-02-23 21 views
4

У меня возникла проблема, которую я не могу решить при создании новой базы данных через частную установку программного обеспечения.SQL Server transaction (ID) Deadlock

Deadlock error image

ссылка на XML файл трассировки отслеживания затора XML File here

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

заявление: EXEC [ISC_RAS_CD_APP] .dbo.sp_changedbowner @loginame = N'sa», @map = ложь

enter image description here

<deadlock-list> 
    <deadlock 
     victim="process4efa404e8"> 
     <process-list> 
      <process 
       id="process4efa404e8" 
       taskpriority="0" 
       logused="0" 
       waitresource="KEY: 1:281474978545664 (11ea04af99f6)" 
       waittime="4947" 
       ownerId="1284191" 
       transactionname="HkHostCkptEnableDisable" 
       lasttranstarted="2017-02-23T12:51:54.617" 
       XDES="0x4ff1e5be0" 
       lockMode="S" 
       schedulerid="4" 
       kpid="10252" 
       status="suspended" 
       spid="62" 
       sbid="0" 
       ecid="0" 
       priority="0" 
       trancount="1" 
       lastbatchstarted="2017-02-23T12:51:54.610" 
       lastbatchcompleted="2017-02-23T12:51:54.610" 
       lastattention="2017-02-23T12:51:54.580" 
       clientapp="SQL Management" 
       hostname="IDQSRV01" 
       hostpid="8940" 
       loginname="HMS\OrenG" 
       isolationlevel="read committed (2)" 
       xactid="1284156" 
       currentdb="12" 
       lockTimeout="4294967295" 
       clientoption1="673185824" 
       clientoption2="128056"> 
       <executionStack> 
        <frame 
         procname="mssqlsystemresource.sys.sp_changedbowner" 
         line="26" 
         stmtstart="1656" 
         stmtend="1686" 
         sqlhandle="0x0300ff7f12d71ceed5d2350180a4000001000000000000000000000000000000000000000000000000000000"> 
checkpoint  </frame> 
        <frame 
         procname="adhoc" 
         line="1" 
         sqlhandle="0x01000c0069b98f048084f3000500000000000000000000000000000000000000000000000000000000000000"> 
EXEC [ISC_RAS_CD_APP].dbo.sp_changedbowner @loginame = N'sa', @map = false  </frame> 
       </executionStack> 
       <inputbuf> 
EXEC [ISC_RAS_CD_APP].dbo.sp_changedbowner @loginame = N'sa', @map = false </inputbuf> 
      </process> 
     </process-list> 
     <resource-list> 
      <keylock 
       hobtid="281474978545664" 
       dbid="1" 
       objectname="master.sys.sysdbreg" 
       indexname="clst" 
       id="lock5006efc00" 
       mode="X" 
       associatedObjectId="281474978545664"> 
       <owner-list> 
        <owner 
         id="process4efa404e8" 
         mode="X" /> 
        <owner 
         id="process4efa404e8" 
         mode="S" 
         requestType="wait" /> 
       </owner-list> 
       <waiter-list> 
        <waiter 
         id="process4efa404e8" 
         mode="S" 
         requestType="wait" /> 
       </waiter-list> 
      </keylock> 
     </resource-list> 
    </deadlock> 
</deadlock-list> 

"са" является пользователем по умолчанию, которое я создал при установке новый сервер.

Мой приоритет задачи установлен в 0, но каждый раз он дает мне другой идентификатор задачи, поэтому я не уверен, могу ли я его изменить.

Я смотрел каждый ответ онлайн, но ничто не могло мне помочь, у кого-то есть идея, что я могу сделать, чтобы исправить это?

При необходимости может быть предоставлена ​​дополнительная информация.

С уважением

+1

вам нужно будет добавить тупиковый график – TheGameiswar

+0

@MartinSmith Как это сделать? – Orenger

+0

В профайлере щелкните правой кнопкой мыши, и я думаю, что этот параметр называется информацией о событии извлечения, чтобы сохранить его как XML-файл, - тогда вы можете вставить его в свой вопрос. –

ответ

2

Это странный график. Сеанс зашел в тупик, ожидая ресурса, который сам сеанс.

Вы предоставили трассировку Profiler не только график взаимоблокировки.

Основываясь на том, что я могу воспроизвести проблему на 2014, но не 2012 или 2016.

код, который воспроизводит этот вопрос для меня на всех 2014. случаях я испытал (со сборками, как показано ниже)

  • (SP1-CU9-ГДР) (KB3194722) - 12.0.4487.0 (X64)
  • (SP2) (KB3171021) - 12.0.5000.0 (X64))
  • Microsoft SQL Server 2014 (SP2-CU4) (KB4010394) - 12.0.5540.0 (X64)

 

IF db_id('FOO') IS NOT NULL 
BEGIN 
print 'dropping db' 
use master 
alter database [FOO] set single_user with rollback immediate 
drop database [FOO] 
END 

go 

CREATE DATABASE [FOO] 
go 

BEGIN TRANSACTION 
use [FOO] 
EXEC [FOO].dbo.sp_changedbowner @loginame = N'sa', @map = false 
COMMIT 

Я принимаю Hk в (имя транзакции в тупиковый граф) HkHostCkptEnableDisable относится к «Hekaton», так что, возможно, это была проблема введена с некоторым изменением кода для поддержки в OLTP памяти в 2014 году .

Проблема исчезает, если я избавлюсь от явной транзакции. Таким образом, одним из способов было бы сделать это, чтобы освободить блокировку, которая оспаривается.

Или же вы можете следовать советам в устаревания уведомления для sp_changedbowner

Эта функция будет удалена в будущей версии Microsoft SQL Server.Избегайте использования этой функции в новых разработках и планируйте изменять приложения, которые в настоящее время используют эту функцию. Вместо этого используйте ALTER АВТОРИЗАЦИЯ.

sp_changedbowner называет это так или иначе, но добавляет дополнительный checkpoint, что вызывает проблему (я также получаю тупик, если я использую ниже код с контрольной точкой линии незакомментированной).

BEGIN TRANSACTION 
alter authorization on database::[FOO] to [sa] 
--checkpoint 
COMMIT 

Блокпост, кажется, вызывает чтение к той же строке в master.sys.sysdbreg, что исключительно заблокированный alter authorization в той же сессии раньше (выход sid столбца обновляется до 0x01 для строки, принадлежащей к этой базе данных) и транзакция контрольной точки не может получить блокировку, предоставленную пользовательской транзакции.

+1

https://connect.microsoft.com/SQLServer/Feedback/Details/3124865 –