Блоки на SQL Server дозволяють забезпечити цілісність даних, змінюючи декілька користувачів. SQL Server блокує об'єкти в таблиці на початку транзакції та видаляє замок, коли він завершиться. У цій статті ми дізнаємось, як шукати блокування в базі даних MS SQL Server та видалити їх.
Ви можете імітувати блокування однієї з таблиць за допомогою необмеженої транзакції (яка не завершена через відкат або зобов'язання). Наприклад, дотримуйтесь такого запиту SQL:
Використовуйте TESDB1
Розпочати транзакцію
Видалити верх (1) від TblStudents
SQL Server перед внесенням змін спочатку заблокує таблицю. Спробуйте відкрити студію управління SQL Server та зробити простий запит SQL для зразка:
Виберіть * з tblStudents
Запит замерзне ( Виконання запитів
) Поки він не випаде тайм -аут. Справа в тому, що запит SELECT намагається зв’язатися з даними в таблиці, яка заблокована SQL Server.
Щоб відобразити список заблокованих запитів на MSSQL Server, заповніть команду:
Виберіть CMD,* з sys.Sysprocesses
Де заблоковано> 0
Виберіть * з Master.DBO.Sysprocesses
Що
dbid = db_id ('testb12') і заблокований 0
Замовлення заблокованим
Блокований стовпець вказує на ідентифікатор процесу PID, який заблокував ресурси. Тут ви також можете побачити час очікування цього запиту (час очікування в мілілізах). Ви можете використовувати це поле для пошуку найгірших замків.
Виберіть * з
Майстер.DBO.Sysprocesses
Що 1 = 1
--І заблоковано 0
і SPID = 59
Відповідно до процесу SPID, ви можете отримати код останнього запиту SQL, виконаний як частина цього процесу (транзакція):
DBCC inputBuffer (59)
Для виконання процесу та видалення блокування виконайте команду:
Вбити число_сесія
Йти
Наприклад, у моєму випадку це:
Вбити 59
Якщо блоки виникають постійно, і ви хочете визначити найбільш інтенсивні ресурси запитів, ви можете створити окрему збережену процедуру:
Створити процедуру printcurrentcode
@Spid Inte
Як
Оголосити @sql_handle binary (20), @stmt_start int, @stmt_end int
Виберіть @sql_handle = sql_handle, @stmt_start = stmt_start/2, @stmt_end = випадок, коли stmt_end = -1 тоді -1 else stmt_end/2 кінець
Від господаря.DBO.Sysprocesses
Який spid = @spid і ecid = 0
Оголосити @line nvarchar (4000)
Set @line = (виберіть substring ([text], coalesce (nullif (@stmt_start, 0), 1),
CASE @STMT_END, коли -1, потім DATALLENGE ([TEXT]) else (@stmt_end - @stmt_start) end) від :: fn_get_sql (@sql_handle)))
Друк @line
Тепер, щоб відобразити SQL -код, який заблокував таблицю, вам потрібно вказати лише його суп:Exec printcurrentcode 51
Також код запиту можна отримати за допомогою SQL_Handle. Наприклад:
Виберіть * з sys.dm_exec_sql_text (0x0100050069139b0650b35ea647020000000000)
Для пошуку замків на MS SQL Server ви можете використовувати Microsoft SQL Server Management Studio. Ви можете використовувати один із наступних методів:
- Натисніть праву кнопку на Півночі, запустіть монітор активності та розширюйте процеси. Список запитів, що очікують на випуск ресурсів, вказується зі статусом призупиненого.
- Виберіть базу даних -> Звіти -> Усі блокуючі транзакції. Тут ви також можете побачити список заблокованих запитів та джерела блокування SPID.