Чи отримує простий вибір запиту блокування?


14

Я дуже новачок у SQL Server, і хотів би зрозуміти, чи не selectбуде блокувати наступне, дуже просте твердження.

Select * from Student;

Будь ласка, розгляньте випадок, коли виписка не працює в begin tranблоці.


1
Це набагато складніше питання, ніж можна подумати. Відповідь залежить від багатьох речей (що таке рівень ізоляції транзакцій сеансу? Читається ввімкнена ізоляція знімків? Чи сканований індекс має параметри, що запобігають блокуванню рядків чи сторінок?) І навіть може змінюватися під час запуску оператора (скільки рядки в таблиці? Таблиця розділена?). Ось хороший момент почати читати.
Джон Сейгель

Відповіді:


5

Так, для рядків, які він читає за замовчуванням, він ділиться загальним блокуванням (він також бере блокування "Намір спільного доступу" на всіх сторінках кластерного індексу, який він буде читати), це робиться для запобігання брудних зчитувань. Однак є способи обійти це (SQL Server має підказку про блокування). Якщо оператор відсутній у BEGIN TRAN, блокування знімається після запуску оператора SELECT.

Більше інформації можна знайти тут:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server


Крім того, ви також можете встановити рівень ізоляції транзакцій, щоб читати не було передано.
Зейн

1
Отже, якщо SELECT зчитує десять рядків, чи є десять спільних блокувань, поки всі десять рядків не будуть прочитані чи вони придбані та відпущені за рядком?
Ian Warburton

26

Мені хотілося б зрозуміти, чи не буде блокування наступного, дуже простого вибору заяви

Це поширена помилка , що SELECTзапит працює на по замовчуванням READ COMMITTEDрівня ізоляції транзакції буде завжди бере колективні блокування для запобігання брудного читання.

SQL Server може уникнути прийому загальних блокувань рядків на рівні, коли немає небезпеки зчитування невмілих даних без них (хоча блокування Intent-Shared (IS) вищого рівня все ще приймаються).

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

У більшості випадків рядок "розблоковано" безпосередньо перед тим, як сервер обробляє наступний рядок. Існують обставини, коли спільні блокування, прийняті на рівні ізоляції за замовчуванням, зберігаються до кінця поточного виступу, але не до кінця транзакції .

Перевищення поточного рівня ізоляції NOLOCKнатяком на таблицю майже завжди є поганою ідеєю .

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

SQL Server забезпечує широкий спектр рівня ізоляції; виберіть той, який забезпечує гарантії та поведінку, необхідні вашим споживачам даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.