SQL Server

Шукайте замки в MS SQL Server

Шукайте замки в MS SQL Server

Блоки на SQL Server дозволяють забезпечити цілісність даних, змінюючи декілька користувачів. SQL Server блокує об'єкти в таблиці на початку транзакції та видаляє замок, коли він завершиться. У цій статті ми дізнаємось, як шукати блокування в базі даних MS SQL Server та видалити їх.

Ви можете імітувати блокування однієї з таблиць за допомогою необмеженої транзакції (яка не завершена через відкат або зобов'язання). Наприклад, дотримуйтесь такого запиту SQL:

Використовуйте TESDB1
Розпочати транзакцію
Видалити верх (1) від TblStudents

SQL Server перед внесенням змін спочатку заблокує таблицю. Спробуйте відкрити студію управління SQL Server та зробити простий запит SQL для зразка:

Виберіть * з tblStudents

Запит замерзне ( Виконання запитів ) Поки він не випаде тайм -аут. Справа в тому, що запит SELECT намагається зв’язатися з даними в таблиці, яка заблокована SQL Server.

У SQL Server ви можете налаштувати замок на рівні лінії або на рівні всієї таблиці.

Щоб відобразити список заблокованих запитів на MSSQL Server, заповніть команду:

Виберіть CMD,* з sys.Sysprocesses
Де заблоковано> 0

Або відобразити список блоків для певної бази даних:
Виберіть * з Master.DBO.Sysprocesses
Що
dbid = db_id ('testb12') і заблокований 0
Замовлення заблокованим

Блокований стовпець вказує на ідентифікатор процесу PID, який заблокував ресурси. Тут ви також можете побачити час очікування цього запиту (час очікування в мілілізах). Ви можете використовувати це поле для пошуку найгірших замків.

У деяких випадках блокування може бути спричинене цілим процесом процесів. Щоб знайти процес процесу блокування, вам потрібно використовувати наступний запит для SPID, поки ви не знайдете процес із значенням блокування = 0 (це буде процес блокування).

Виберіть * з
Майстер.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. Ви можете використовувати один із наступних методів:

Airdrop не працює, ми вирішуємо всі можливі проблеми
Ми говоримо вам, що робити, якщо Airdrop не працює. Найповніший аналіз усіх можливих сценаріїв, що призводять до проблем при передачі файлів з одного ...
Яка папка $ getCurrent у Windows 10 і чи це можливо
Оновлюючи Windows до нової версії, ви, ймовірно, знайдете це на диску З Ваше місце значно зменшилось. Це нормальне явище, Windows просто зберігає файл...
Як заощадити при купівлі комп’ютера
Основне правило економії грошей при купівлі ПК або ноутбука - це потужність, що відповідає тим операціям, які ми плануємо здійснити. Сила комп'ютерног...