2017-02-23 3 views
4

Ich bin mit einem Problem konfrontiert, das ich nicht lösen kann, während ich eine neue Datenbank durch private Softwareinstallation erstelle.SQL Server-Transaktion (ID) Deadlock

Deadlock error image

Link zu XML-Datei der Spur aus der Sackgasse Tracking XML File here

konnte ich verfolgen, was den Stillstand verursacht und seine während ich versuche, db Eigentümer zu ändern.

Anweisung: EXEC [ISC_RAS_CD_APP] .dbo.sp_changedbowner @loginame = N'sa‘, @map = false

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> 

"sa" ist ein Standardbenutzer, die ich erstellt bei der Installation der neue Server.

Meine Aufgabenpriorität ist auf 0 gesetzt, aber jedesmal gibt es mir eine andere Aufgabenkennung, also bin ich nicht sicher, ob ich es ändern kann.

Ich habe jede einzelne Antwort online betrachtet, aber nichts konnte mir helfen, hat jemand eine Idee, was ich tun kann, um es zu beheben?

weitere Informationen können bei Bedarf geliefert werden.

Grüße

+1

Sie müssen Deadlock-Grafik hinzufügen – TheGameiswar

+0

@MartinSmith Wie mache ich das? – Orenger

+0

In Profiler rechten Maustaste und ich denke, die Option heißt Extract Event Info, um es als XML-Datei zu speichern - dann können Sie es in Ihre Frage einfügen –

Antwort

2

Dies ist eine seltsame Grafik. Die Sitzung ist festgefahren und wartet auf eine Ressource, die die Sitzung selbst besitzt.

Sie haben den Profiler-Trace nicht nur für den Deadlock-Graphen bereitgestellt.

Basierend auf, dass ich das Problem auf 2014 reproduzieren kann, aber nicht 2012 oder 2016.

-Code, der auf alle 2014-Instanzen für mich das Problem reproduziert ich getestet habe (mit Builds wie unten)

  • (SP1-CU9-DDR) (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 

Ich gehe davon aus den Hk im HkHostCkptEnableDisable (Transaktionsnamen in der Deadlock Graph) bezieht sich auf "Hekaton" so vielleicht war dies ein Problem mit einiger Codeänderung eingeführt im Speicher OLTP im Jahr 2014 zu unterstützen .

Das Problem verschwindet, wenn ich die explizite Transaktion los werde. Ein Ansatz wäre also, die Sperre zu lösen, die angefochten wird.

Oder alternativ können Sie den Rat in der deprecation Mitteilung für sp_changedbowner

folgen Dieses Feature wird in einer zukünftigen Version von Microsoft SQL Server entfernt werden.Vermeiden Sie die Verwendung dieser Funktion in neuen Entwicklungsarbeiten, und planen Sie, Anwendungen zu ändern, die diese Funktion derzeit verwenden. Verwenden Sie stattdessen ALTER AUTHORIZATION.

sp_changedbowner Anrufe ohnehin dies aber fügt eine zusätzliche checkpoint, die das Problem verursacht (ich auch aus der Sackgasse, wenn ich den Code mit dem Kontrollpunkt Linie uncommented verwenden).

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

Der Kontrollpunkt scheint eine Lese auf die gleiche Zeile in master.sys.sysdbreg zu verursachen, die ausschließlich durch die alter authorization innerhalb derselben Sitzung früher (die sid Spalte 0x01 aktualisiert wird für die Zeile zu dieser Datenbank gehört) gesperrt ist und die Die Checkpoint-Transaktion kann die Sperre nicht für die Benutzertransaktion erhalten.

+1

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