Contexto: Estou ministrando um treinamento in-company e preparando uma série de novas demonstrações para este cliente. Após escrever uma procedure que era para ser problemática, esbarrei em deadlocks mais interessantes do que eu havia planejado….
Gostei da brincadeira e resolvei compartilhar com vocês um deadlock art generator!
Algumas imagens da saída estão abaixo. Também coloquei no OneDrive um trace com alguns deadlocks que eu coletei.
A primeira ver que ouvi falar sobre deadlock art foi em um post do Catae (https://blogs.msdn.microsoft.com/fcatae/2010/03/18/deadlock-art/) que sempre cito no módulo de locking nos meus treinamentos.
Para reproduzir em seu ambiente, você vai fazer o seguinte.
1. Crie a procedure proc_Divertida no AdventureWorks2014
2. Utilizando o SQLQueryStress, mande 20/30 threads com 3/4 execuções “EXEC proc_Divertida;”
a. O número de threads/repetições você muda de acordo com seu interesse na arte. kkkk
3. Monitore o deadlock graph no profiler
HAVE FUN!
Abraços,
USE AdventureWorks2014
GO
IF OBJECT_ID('dbo.proc_Divertida') IS NOT NULL
DROP PROCEDURE dbo.proc_Divertida
go
CREATE PROCEDURE dbo.proc_Divertida
AS
DECLARE @OrderID INT = (CAST((RAND() * 100000) AS INT) % 30000) + 43659;
PRINT @OrderID
BEGIN TRANSACTION
UPDATE Sales.SalesOrderDetail
SET UnitPrice = UnitPrice
WHERE SalesOrderID = @OrderID
; WITH C AS (
SELECT (Quantity * ActualCost) AS LineTotal, PRODUCTID, TransactionDate
FROM Production.TransactionHistory
UNION
SELECT (Quantity * ActualCost), PRODUCTID, TransactionDate
FROM Production.TransactionHistoryArchive
UNION
SELECT (UnitPrice * OrderQty), SOD.ProductID, SOH.OrderDate
FROM Sales.SalesOrderDetail AS SOD
INNER JOIN Sales.SalesOrderHeader AS SOH
ON SOH.SalesOrderID = SOD.SalesOrderID
)
SELECT
C.ProductID,
YEAR(TransactionDate),
SUM(LineTotal)
FROM C
GROUP BY GROUPING SETS (ProductID, YEAR(TransactionDate), (ProductID, YEAR(TransactionDate)), ())
COMMIT TRANSACTION
GO
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Nenhum comentário:
Postar um comentário