Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 535

W naszej firmie jest wdrożona aplikacja, która korzysta z bazy danych SQL Server 2012. Czasami zdarza się, że aplikacja zawiesza się. Okazuje się, że przyczyną są otwarte transakcje, ale nie potrafimy stwierdzić, które zapytanie jest temu winne.

W jaki sposób wyświetlić zapytanie SQL-a, które spowodowało otwarcie transakcji?

Uczestnik szkolenia
  • Zapytał
  • @ Uczestnik szkolenia | 30.09.2014

Odpowiedź (1)

  • 3

 

Tabela sys.sysprocesses zawiera aktualnie uruchomione procesy, a wsród kolumn jest open_tran, czyli ilość otwartych transakcji oraz sql_handle, czyli uchwyt do zapytania SQL-a. Wystarczy przefiltrować listę procesów, aby otrzymać tylko te, które posiadają transakcje. 

Natomiast funkcja dm_exec_sql_text umożliwia wyświetlenie treści zapytania SQL-a na podstawie uchwytu sql_handle. 

Gotowe zapytanie:

 

SELECT 
   DB_NAME(dbid) AS DBNAME,
   (SELECT text FROM sys.dm_exec_sql_text(sql_handle)) AS SQLSTATEMENT 
FROM 
  master..sysprocesses 
WHERE open_tran > 0

 

Należy jednak pamiętać, że jeśli była to sekwencja poleceń sql, na przykład:

BEGIN TRAN
 
UPDATE Customers SET CustomerName='Altkom'
WHERE CustomerId = 199;

UPDATE Customers SET CustomerName='ABC'
WHERE CustomerId = 299;

SELECT CustomerName FROM Customers;

COMMIT
  
GO 

 

 To otrzymamy ostatnie zapytanie z batch'a, w tym przypadku SELECT, a nie zapytanie, które faktycznie otworzyło transakcję.

 

  • Odpowiedział
  • @ | 30.09.2014
  • TRENER ALTKOM AKADEMII