Beruflich Dokumente
Kultur Dokumente
Para que uma tarefa seja executada em MARS, ela deve adquirir o mutex da
sessão. Se a tarefa estiver sendo executada em uma transação, deverá adquirir
o mutex de transação. Isso garante que apenas uma tarefa esteja ativa em um
determinado momento, sessão e transação. Quando os mutexes solicitados
forem adquiridos, a tarefa poderá ser executada. Quando a tarefa termina, ou
está no meio da solicitação, primeiro ela libera o mutex de transação e, depois, o
mutex de sessão em ordem reversa de aquisição. Porém, podem ocorrer
deadlocks com esses recursos. No exemplo de código a seguir, duas tarefas,
solicitação de usuário U1 e solicitação de usuário U2, estão sendo executadas na
mesma sessão.
Copiar
Detecção de deadlock
Todos os recursos listados na seção anterior participam do esquema de detecção de
deadlock Mecanismo de Banco de Dados. A detecção de deadlock é executada por um
thread de monitor de bloqueio que periodicamente inicia uma pesquisa por todas as
tarefas em uma instância do Mecanismo de Banco de Dados. Os seguintes pontos
descrevem o processo de pesquisa:
Por padrão, o Mecanismo de Banco de Dados escolhe a sessão que está executando a
transação mais fácil de ser revertida como a vítima de deadlock. Alternativamente, um
usuário pode especificar a prioridade de sessões em uma situação de deadlock usando a
instrução SET DEADLOCK_PRIORITY. O DEADLOCK_PRIORITY pode ser definida como
LOW, NORMAL ou HIGH ou, alternativamente, pode ser definido como qualquer valor de
inteiro no intervalo (-10 a 10). A prioridade de deadlock assume NORMAL como padrão.
Se duas sessões tiverem prioridades de deadlock diferentes, a sessão com a prioridade
mais baixa será escolhida como a vítima de deadlock. Se ambas as sessões tiverem a
mesma prioridade de deadlock, a sessão com a transação menos dispendiosa para ser
revertida será escolhida. Se as sessões envolvidas no ciclo de deadlock tiverem a
mesma prioridade de deadlock e o mesmo custo, a vítima será escolhida
aleatoriamente.
waitresource. O recurso
requerido pela tarefa.
waittime. O tempo em
milissegundos de espera
pelo recurso.
schedulerid. O
agendador associado à
essa tarefa. Consulte
sys.dm_os_schedulers
(Transact-SQL).
hostname. O nome da
estação de trabalho.
isolationlevel. O nível
de isolamento da
transação atual.
Xactid. A ID da
transação que tem
controle da solicitação.
currentdb. A ID do
banco de dados.
lastbatchstarted. A
última vez em que um
processo cliente iniciou
uma execução em lote.
lastbatchcompleted. A
última vez em que um
processo cliente concluiu
uma execução em lote.
clientoption1 e
clientoption2. Defina as
opções nessa conexão de
cliente. Esse é um
bitmask que inclui
informações sobre
opções normalmente
controladas por
instruções SET, como
SET NOCOUNT e SET
XACTABORT.
associatedObjectId.
Representa a ID de HoBT
(heap ou árvore B).
Atributos RID. Identifica a única linha Nenhum exclusivo Nenhum exclusivo para
do recurso dentro de uma tabela na para esse sinalizador esse sinalizador de
qual um bloqueio é mantido de rastreamento. rastreamento.
ou solicitado. O RID é
representado como RID:
db_id:file_id:page_no:row_n
o. Por exemplo, RID:
6:1:20789:0.
• DB: db_id
• DB:
db_id[BULK-OP-DB],
que identifica o
bloqueio de banco
de dados feito pelo
banco de dados de
backup.
• DB:
db_id[BULK-OP-DB],
que identifica o
bloqueio feito pelo
log de backup
daquele banco de
dados específico.
METADATA. Representa os
recursos de metadados
envolvidos em um
deadlock. Como METADATA
tem muitos sub-recursos, o
valor retornado depende do
sub-recurso envolvido no
deadlock. Por exemplo,
METADATA.USER_TYPE
retorna user_type_id
=<integer_value>. Para
obter mais informações
sobre os recursos e sub-
recursos de METADATA,
consulte sys.dm_tran_locks
(Transact-SQL).
Copiar
Deadlock encountered .... Printing deadlock information
Wait-for graph
Node:1
Node:2
Copiar
deadlock-list
deadlock victim=process689978
process-list
process id=process6891f8 taskpriority=0 logused=868
waitresource=RID: 6:1:20789:0 waittime=1359 ownerId=310444
transactionname=user_transaction
lasttranstarted=2005-09-05T11:22:42.733 XDES=0x3a3dad0
lockMode=U schedulerid=1 kpid=1952 status=suspended spid=54
sbid=0 ecid=0 priority=0 transcount=2
lastbatchstarted=2005-09-05T11:22:42.733
lastbatchcompleted=2005-09-05T11:22:42.733
clientapp=Microsoft SQL Server Management Studio - Query
hostname=TEST_SERVER hostpid=2216 loginname=DOMAIN\user
isolationlevel=read committed (2) xactid=310444 currentdb=6
lockTimeout=4294967295 clientoption1=671090784 clientoption2=390200
executionStack
frame procname=AdventureWorks2008R2.dbo.usp_p1 line=6 stmtstart=202
sqlhandle=0x0300060013e6446b027cbb00c69600000100000000000000
UPDATE T2 SET COL1 = 3 WHERE COL1 = 1;
frame procname=adhoc line=3 stmtstart=44
sqlhandle=0x01000600856aa70f503b8104000000000000000000000000
EXEC usp_p1
inputbuf
BEGIN TRANSACTION
EXEC usp_p1
process id=process689978 taskpriority=0 logused=380
waitresource=KEY: 6:72057594057457664 (350007a4d329)
waittime=5015 ownerId=310462 transactionname=user_transaction
lasttranstarted=2005-09-05T11:22:44.077 XDES=0x4d9e258 lockMode=U
schedulerid=1 kpid=3024 status=suspended spid=55 sbid=0 ecid=0
priority=0 transcount=2 lastbatchstarted=2005-09-05T11:22:44.077
lastbatchcompleted=2005-09-05T11:22:44.077
clientapp=Microsoft SQL Server Management Studio - Query
hostname=TEST_SERVER hostpid=2216 loginname=DOMAIN\user
isolationlevel=read committed (2) xactid=310462 currentdb=6
lockTimeout=4294967295 clientoption1=671090784 clientoption2=390200
executionStack
frame procname=AdventureWorks2008R2.dbo.usp_p2 line=6 stmtstart=200
sqlhandle=0x030006004c0a396c027cbb00c69600000100000000000000
UPDATE T1 SET COL1 = 4 WHERE COL1 = 1;
frame procname=adhoc line=3 stmtstart=44
sqlhandle=0x01000600d688e709b85f8904000000000000000000000000
EXEC usp_p2
inputbuf
BEGIN TRANSACTION
EXEC usp_p2
resource-list
ridlock fileid=1 pageid=20789 dbid=6
objectname=AdventureWorks2008R2.dbo.T2
id=lock3136940 mode=X associatedObjectId=72057594057392128
owner-list
owner id=process689978 mode=X
waiter-list
waiter id=process6891f8 mode=U requestType=wait
keylock hobtid=72057594057457664 dbid=6
objectname=AdventureWorks2008R2.dbo.T1
indexname=nci_T1_COL1 id=lock3136fc0 mode=X
associatedObjectId=72057594057457664
owner-list
owner id=process6891f8 mode=X
waiter-list
waiter id=process689978 mode=U requestType=wait
Este é um evento do SQL Server Profiler que apresenta uma representação gráfica das
tarefas e recursos envolvidos em um deadlock. O exemplo a seguir mostra a saída do
SQL Server Profiler quando o evento de gráfico de deadlock é ativado.
Para obter mais informações sobre a execução do gráfico de deadlock do SQL Server
Profiler, consulte Analisando deadlocks com o SQL Server Profiler.
Consulte também
Conceitos
Deadlock
Minimizando deadlocks