Microsoft SQL Server'da Kilitleri Bul ve Kaldır


MS SQL Server'daki kilitler, aynı anda birden fazla kullanıcı tarafından değişiklik yapıldığında verilerin bütünlüğünü sağlamanın bir yoludur. MSSQL, bir işlem başladığında bir tablodaki nesneleri kilitler ve işlem bittiğinde kilidi serbest bırakır. Bu yazımızda MS SQL Server veritabanında kilitlerin nasıl bulunacağını ve nasıl kaldırılacağını öğreneceğiz.

Bitmemiş bir işlem (geri alma veya taahhüt tarafından tamamlanmamış) kullanılarak tablolardan birinde kilit simüle etmek mümkündür. Örneğin, aşağıdaki SQL sorgusunu kullanın:

USE tesdb1
BEGIN TRANSACTION
DELETE TOP(1) FROM tblStudents

Herhangi bir değişiklik yapılmadan önce, SQL Server tabloyu kilitleyecektir. Şimdi SQL Server Management Studio'yu açmayı ve basit bir SQL seçim sorgusu yürütmeyi deneyin:

SELECT * FROM tblStudents

Sorgu, zaman aşımına uğrayana kadar "Sorgu yürütülüyor " durumunda donacak. Bunun nedeni, SELECT sorgusunun SQL Server tarafından kilitlenmiş bir tablodaki verilere erişmeye çalışmasıdır.

Microsoft SQL Server'da satır düzeyinde veya tam tablo düzeyinde kilitler yapılandırabilirsiniz.

MSSQL Server'da engellenen tüm sorguların bir listesini almak için komutu çalıştırın.

select cmd,* from sys.sysprocesses
where blocked > 0

Ayrıca, belirli bir veritabanı için bir kilit listesi de görüntüleyebilirsiniz:

SELECT * FROM master.dbo.sysprocesses
WHERE
dbid = DB_ID('testdb12') and blocked <> 0
order by blocked

Engellendi sütunu, kaynakları engelleyen işlemin işlem kimliğini gösterir. Ayrıca bu sorgu için bekleme süresini de gösterir (milisaniye cinsinden bekleme süresi). Gerekirse, bu, en eski veya en son kilitleri aramak için kullanılabilir.

Bazı durumlarda, tüm süreç ağacı bir kilit oluşturabilir. Kaynak kilitleme işlemini bulmak için, kilidi tutan ilk işlem olan blocked=0 ile işlemi bulana kadar SPID için aşağıdaki sorguyu kullanın.

select * FROM
master.dbo.sysprocesses
where 1=1
--and blocked <> 0
and spid = 59

SPID işlemi, size söz konusu işlem veya işlem tarafından yürütülen son SQL sorgusunun T-SQL kodunu verir:

DBCC INPUTBUFFER(59)

Süreci zorlamak ve kilidi serbest bırakmak için şu komutu çalıştırın:

KILL number_of_session
GO

Benim durumumda, olacak:

KILL 59

Kilitler sürekli olarak oluşuyorsa ve en yoğun kaynak kullanan sorguları belirlemek istiyorsanız, ayrı bir saklı yordam oluşturabilirsiniz:

CREATE PROCEDURE GetCurrentQueryCode
@SPID int
AS
DECLARE @sql_handle binary(20), @stmt_start int, @stmt_end int
SELECT @sql_handle = sql_handle, @stmt_start = stmt_start/2, @stmt_end = CASE WHEN stmt_end = -1 THEN -1 ELSE stmt_end/2 END
FROM master.dbo.sysprocesses
WHERE spid = @SPID AND ecid = 0
DECLARE @line nvarchar(4000)
SET @line = (SELECT SUBSTRING([text], COALESCE(NULLIF(@stmt_start, 0), 1),
CASE @stmt_end WHEN -1 THEN DATALENGTH([text]) ELSE (@stmt_end - @stmt_start) END) FROM ::fn_get_sql(@sql_handle))
print @line

Şimdi, tabloyu kilitleyen SQL sorgusunu görmek istiyorsanız tek yapmanız gereken SPID'sini belirtmek:

Exec GetCurrentQueryCode 51

Sorgu kodunu kilitleme işleminin sql_handle'ından da alabilirsiniz. Örneğin

select * from sys.dm_exec_sql_text (0x0100050069139B0650B35EA64702000000000000)

MS SQL Server'da kilit aramak için Microsoft SQL Server Management Studio'yu kullanabilirsiniz. Aşağıdaki yöntemlerden birini kullanabilirsiniz:

  • Sunucuya sağ tıklayın, Etkinlik İzleyici'yi açın ve İşlemler'i genişletin. SUSPENDED durumuyla kaynakların serbest bırakılmasını bekleyen isteklerin bir listesini göreceksiniz.

  • Bir veritabanı seçin ve Raporlar -> Tüm Engelleme İşlemleri'ne gidin. Ayrıca kilitli sorguların bir listesini ve kilitleme kaynağının SPID'sini gösterir.

İlgili makaleler