Святая корова, у тебя здесь много вопросов, хе. Вот несколько ответов:
При вставке записи в эту таблицу блокирует ли она всю таблицу?
Не по умолчанию, но если вы используете подсказку TABLOCK или выполняете определенные операции массовой загрузки, тогда да.
Так что, если вы запрашиваете какие-либо данные из таблицы, она будет блокироваться, пока вставка не будет завершена (я понимаю, что есть способы обойти это, но я говорю по умолчанию)?
Этот становится немного хитрее. Если кто-то пытается выбрать данные со страницы в таблице, которую вы заблокировали, тогда да, вы заблокируете их. Вы можете обойти это с такими вещами, как подсказка NOLOCK в операторе select или с помощью Read Committed Snapshot Isolation. Для начала о том, как работают уровни изоляции, посмотрите Плакат об уровнях изоляции Кендры Литтл .
Сколько времени потребуется, чтобы вызвать тупик? Будет ли это время зависеть от того, какая нагрузка на сервер, например если нагрузка невелика, потребуется ли больше времени, чтобы вызвать взаимоблокировку?
Взаимные блокировки не основаны на времени - они основаны на зависимостях. Скажем, у нас такая ситуация:
- Запрос A содержит несколько блокировок, и чтобы завершить запрос, ему нужны данные, заблокированные Query B
- В запросе B также есть несколько блокировок, и для завершения запроса ему нужны вещи, заблокированные запросом A
Ни один запрос не может двигаться вперед (например, мексиканское противостояние), поэтому SQL Server называет это ничьей, снимает чей-то запрос в спину, снимает блокировки и позволяет другому запросу продолжать работу. SQL Server выбирает жертву на основе того, какой из них будет дешевле откатить. Если вы хотите получить фантазию, вы можете использовать SET DEADLOCK_PRIORITY LOW в определенных запросах, чтобы рисовать цели на их спине, и SQL Server сначала их застрелит.
Есть ли способ контролировать и видеть, что заблокировано в конкретный момент времени?
Абсолютно - есть динамические административные представления (DMV), которые вы можете запрашивать, например, sys.dm_tran_locks, но самый простой способ - использовать бесплатную хранимую процедуру sp_WhoIsActive Адама Маханича . Это действительно приятная замена sp_who, которую вы можете назвать так:
sp_WhoIsActive @get_locks = 1
Для каждого запущенного запроса вы получите небольшой XML-код, описывающий все блокировки, которые он удерживает. Также есть столбец Блокировка, чтобы вы могли видеть, кто кого блокирует. Чтобы интерпретировать удерживаемые блокировки, вам нужно проверить Books Online описания типов блокировок .
Если каждый поток выполняет запросы к отдельным таблицам, существует ли тогда случай блокирования? Так разве не так, что тупик может возникнуть, только если у вас есть запрос, который имеет соединение и работает с несколькими таблицами?
Верьте или нет, один запрос может фактически заблокировать сам себя , и да, запросы могут заблокировать только одну таблицу. Чтобы узнать больше о взаимоблокировках, посмотрите Трудность с тупиками от Иеремии Пешка .