Представьте таблицу T, которая используется следующим образом:набор CONTEXT_INFO выберите context_info(), блокировка
В момент времени Т0: ИСП 1: начать транзакцию ... вставку в Т (...) значения (...); ... commit;
В момент времени T1 SPID 2: начать транзакцию выбрать * из T где C = cval; ... commit;
Предположим, что уровень изоляции транзакции установлен на сериализуемый. Также предположим, что SPID1 удается взять TABLOCKX на T до времени T1, а также что SPID1 выполняет длинную транзакцию, в результате чего SPID2 ожидает, когда TABLOCKX на T будет выпущен.
Теперь рассмотрим тот же сценарий, используя CONTEXT_INFO вместо Т
В момент времени Т0: ИСП 1: начать транзакцию ... SET CONTEXT_INFO = 0xFF; ... конец;
В момент времени T1 SPID 2: начать транзакцию select context_info(); ... конец;
Снова предположим, что уровень изоляции транзакции установлен на сериализуемый.
Я знаю, что CONTEXT_INFO за соединение. Я не предполагаю, что SPID 1 и SPID 2 обмениваются данными с помощью CONTEXT_INFO. Они полностью независимы, предполагают, что они используют CONTEXT_INFO для отдельных целей синхронно.
Теперь выбор выполняется без какого-либо ожидания из-за TABLOCKX. На самом деле я не смог спровоцировать любой тип ожидания из-за блокировки с помощью CONTEXT_INFO.
Это нормально со мной, так как мне нужно это поведение. Моя проблема заключается в том, что хотя CONTEXT_INFO должен быть переменной памяти в sql-сервере в «SPID-represenation», он, похоже, хранится в таблице с именем master.dbo.sysprocesses на MSSQL2000 (select context_info() здесь не будет работать) и в sys.sysprocesses на более поздних выпусках MSSQL Server.
Не эти таблицы действуют как все остальные таблицы в отношении блокировки или являются ли эти таблицы просто окнами переменным, не подчиняющимся тем же правилам, что и другие таблицы?
Еще одна вещь, которая меня поразила, заключается в том, что блокировка типа TAB, IS-mode на spt_values принимается upcon set context_info и KEY-типа, блокировки режима RangeS-S при чтении sysprocesses. Но каковы реальные последствия этого, я не понимаю, поскольку это внутренний объект.
Пожалуйста, просветите меня.
С уважением, Jens Nordenbro
- не было достаточно ясно, я знаю CONTEXT_INFO это за соединение. Я не предполагаю, что SPID 1 и SPID 2 обмениваются данными с помощью CONTEXT_INFO. Они полностью независимы, предполагают, что они используют CONTEXT_INFO для отдельных целей.Я просто боюсь, что им нужны одни и те же блокирующие ресурсы. Вот о чем идет речь.
- Что вы подразумеваете под HINT?
Итак, другими словами (только проверка): я не могу создать запорно-побочные эффекты на системные таблицы с помощью: начать транзакцию .. комплект context_info OxFF .. совершить С уважением, Jens Nordenbro –
Нет, совсем нет. * OR * может быть, мы можем считать rowlock только так, что TABLOCK игнорируется и т. Д.: В принципе, мы безопасны в использовании, как мы хотим – gbn