Я дуже новачок у SQL Server, і хотів би зрозуміти, чи не select
буде блокувати наступне, дуже просте твердження.
Select * from Student;
Будь ласка, розгляньте випадок, коли виписка не працює в begin tran
блоці.
Я дуже новачок у SQL Server, і хотів би зрозуміти, чи не select
буде блокувати наступне, дуже просте твердження.
Select * from Student;
Будь ласка, розгляньте випадок, коли виписка не працює в begin tran
блоці.
Відповіді:
Так, для рядків, які він читає за замовчуванням, він ділиться загальним блокуванням (він також бере блокування "Намір спільного доступу" на всіх сторінках кластерного індексу, який він буде читати), це робиться для запобігання брудних зчитувань. Однак є способи обійти це (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
Мені хотілося б зрозуміти, чи не буде блокування наступного, дуже простого вибору заяви
Це поширена помилка , що SELECT
запит працює на по замовчуванням READ COMMITTED
рівня ізоляції транзакції буде завжди бере колективні блокування для запобігання брудного читання.
SQL Server може уникнути прийому загальних блокувань рядків на рівні, коли немає небезпеки зчитування невмілих даних без них (хоча блокування Intent-Shared (IS) вищого рівня все ще приймаються).
Навіть якщо загальні блокування рядків будуть прийняті (можливо , тому , що інша паралельна транзакція змінила сторінку рядок включена) , вони можуть бути звільнені задовго до SELECT
Завершує заяву.
У більшості випадків рядок "розблоковано" безпосередньо перед тим, як сервер обробляє наступний рядок. Існують обставини, коли спільні блокування, прийняті на рівні ізоляції за замовчуванням, зберігаються до кінця поточного виступу, але не до кінця транзакції .
Перевищення поточного рівня ізоляції NOLOCK
натяком на таблицю майже завжди є поганою ідеєю .
Блокування - це деталь реалізації. SQL Server приймає блокування, коли це необхідно, щоб забезпечити відповідність семантичним гарантіям, передбаченим поточним рівнем ізоляції . Безумовно, бувають випадки, коли корисно трохи знати про те, чому робляться замки, але спроба їх передбачити дуже часто контрпродуктивна.
SQL Server забезпечує широкий спектр рівня ізоляції; виберіть той, який забезпечує гарантії та поведінку, необхідні вашим споживачам даних.