Raskite ir pašalinkite užraktus „Microsoft SQL Server“.

Užraktai MS SQL Server yra vienas iš būdų užtikrinti duomenų vientisumą, kai pakeitimus vienu metu atlieka keli vartotojai. MSSQL užrakina objektus lentelėje, kai prasideda operacija, ir atleidžia užraktą, kai operacija baigiasi. Šiame straipsnyje sužinosime, kaip rasti užraktus MS SQL Server duomenų bazėje ir juos pašalinti.

Galima imituoti vienos iš lentelių užraktą naudojant nebaigtą operaciją (tokią, kuri nebuvo užbaigta grąžinant arba įpareigojus). Pavyzdžiui, naudokite šią SQL užklausą:

USE tesdb1
BEGIN TRANSACTION
DELETE TOP(1) FROM tblStudents

Prieš atliekant bet kokius pakeitimus, SQL serveris užrakins lentelę. Dabar pabandykite atidaryti „SQL Server Management Studio“ ir vykdyti paprastą SQL pasirinkimo užklausą:

SELECT * FROM tblStudents

Užklausa bus sustabdyta būsenoje „Vykdoma užklausa“, kol pasibaigs skirtasis laikas. Taip yra todėl, kad SELECT užklausa bando pasiekti duomenis lentelėje, kurią užrakino SQL serveris.

„Microsoft SQL Server“ galite konfigūruoti eilutės arba visos lentelės lygio užraktus.

Norėdami gauti visų užblokuotų MSSQL serverio užklausų sąrašą, paleiskite komandą

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

Taip pat galite rodyti konkrečios duomenų bazės užraktų sąrašą:
SELECT * FROM master.dbo.sysprocesses
WHERE
dbid = DB_ID('testdb12') and blocked <> 0
order by blocked

Stulpelyje Užblokuota rodomas proceso, kuris blokavo išteklius, ID. Taip pat rodomas šios užklausos laukimo laikas (laukimo laikas milisekundėmis). Jei reikia, tai gali būti naudojama ieškant anksčiausių arba naujausių spynų.

Kai kuriais atvejais užraktą gali sukelti visas proceso medis. Norėdami rasti šaltinio užrakto procesą, naudokite šią SPID užklausą, kol rasite procesą su blocked=0, kuris yra pradinis užraktą turintis procesas.

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

Procesas SPID suteikia jums paskutinės SQL užklausos, įvykdytos to proceso ar operacijos, T-SQL kodą:

DBCC INPUTBUFFER(59)

Norėdami priverstinai nužudyti procesą ir atleisti užraktą, paleiskite komandą:

KILL number_of_session
GO

Mano atveju tai bus:

KILL 59

Galite sukurti atskirą saugomą procedūrą, jei užraktai vyksta nuolat ir norite nustatyti daugiausia išteklių reikalaujančias užklausas:

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

Dabar, jei norite pamatyti SQL užklausą, kuri užrakino lentelę, tereikia nurodyti jos SPID:

Exec GetCurrentQueryCode 51

Taip pat žiūrėkite:Kaip įdiegti „SQL Server 2016 CTP 3.0“ sistemoje „Windows Server 2012 R2“.

Taip pat užklausos kodą galite gauti iš užrakinimo proceso sql_handle. Pavyzdžiui

select * from sys.dm_exec_sql_text (0x0100050069139B0650B35EA64702000000000000)

Norėdami ieškoti užraktų MS SQL Server, galite naudoti „Microsoft SQL Server Management Studio“. Galite naudoti vieną iš šių būdų:

Related Posts