sexta-feira, 24 de junho de 2016

FUN! Deadlock art generator

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