«1С:Профессионал» по технологическим вопросам (Раздел 10)

Взаимоблокировки и методы их исправления

Вопрос 10.1
Конфигурация в режиме совместимости с 8.2. СУБД MS SQL Server. Для исправления взаимоблокировки вида «захват ресурсов в разном порядке», когда она возникает на исключительных блокировках СУБД, необходимо:

1. В самом начале транзакции захватить исключительной управляемой блокировкой все ресурсы, с которыми может вестись работа в транзакции
2. Изменить уровень изоляции транзакции на READ COMMITTED SNAPSHOT, отключив режим совместимости с 8.2.
3. Найти второй ресурс и вторую транзакцию и изменить порядок захвата ресурсов
4. Установить исключительную управляемую блокировку непосредственно перед местом записи данных
5. Разбить транзакцию на несколько мелких транзакций

Вопрос 10.2
При борьбе с взаимоблокировками и необходимости перевода базы в управляемый режим управления блокировками правильная последовательность действий:

1. сначала избавиться от взаимоблокировок, только затем перевести базу в управляемый режим управления блокировками.
2. сначала перевести базу в управляемый режим управления блокировками, только потом заниматься избавлением от взаимоблокировок.
3. перевод базы в управляемый режим и избавление от взаимоблокировок это не связанные вещи, можно делать это в любой последовательности.

Вопрос 10.3
Что такое взаимоблокировка?

1. Ситуация, когда две или более транзакции ждут друг друга из-за того, что каждая из сторон блокирует ресурс, необходимый другой стороне.
2. Ситуация, когда две или более блокировки ждут друг друга из-за того, что каждая из сторон блокирует ресурс, необходимый другой стороне.
3. Ситуация, когда два пользователя пытаются открыть один документ.
4. Момент времени, когда пользователь получает сообщение вида: «SQL Server: Lock request time out period exceeded»

Взаимоблокировка возникает, когда две или более транзакции ждут друг друга из-за  того, что каждая из сторон блокирует ресурс, необходимый другой стороне.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.61

Вопрос 10.4
Какая схема представляет собой схему взаимоблокировки с повышением уровня блокировки ресурса (T1,T2 – транзакции, S/X –разделяемая/исключительная, Р1,Р2 – ресурсы)?

1. Т1: X(P1) -> X(P2), T2: X(P2) -> X(P1).
2. T1: X(P1) -> S(P1+P2), T2: X(P2) -> S(P1+P2).
3. Т1: S(P1) -> X(P1), T2: S(P1) -> X(P1).
4. T1: S(P1) -> S(P2), T2: S(P2) -> S(P1).
5. Верны ответы 2 и 3.

Повышение уровня блокировки ресурса. S1 -> X1, S1-> X1.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.63

Вопрос 10.5
Каковы наиболее типичные причины взаимоблокировок?

1. Захват ресурсов в разном порядке, повышение уровня изоляции транзакции.
2. Захват ресурсов в разном порядке, повышение уровня блокировки в рамках одной транзакции, неоптимальная работа запроса.
3. Захват ресурсов в разном порядке, повышение уровня изоляции транзакции, эскалация блокировок.
4. Захват ресурсов в разном порядке, повышение уровня изоляции транзакции, повышение гранулярности блокировок.
5. Верны ответы 3 и 4

Возникновение взаимоблокировок сводят к следующим ситуациям.
1. Захват ресурсов в разном порядке. X1 -> X2, X2-> X1.
2. Повышение уровня блокировки ресурса. S1 -> X1, S1-> X1.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.62

Вопрос 10.6
Для чего на практике бывает нужно использовать свойство БлокироватьДляИзменения?

1. Свойство используется для установки управляемых блокировок по части набора записи.
2. Установка управляемой блокировки без учета разделения итогов ухудшает параллельность записи, но защищает от взаимоблокировок при контроле остатков.
3. Для обеспечения целостности читаемых данных наборами записей от изменения.
4. Чтобы улучшить параллельность работы в автоматическом режиме управления блокировками.
5. Установка блокировки U «для обновления» на уровне СУБД без учета разделения итогов ухудшает параллельность записи, но защищает от взаимоблокировок при контроле остатков.

Если для регистра бухгалтерии/накопления разрешено и включено разделение итогов, то запись движений осуществляется с учетом сплиттера (разделителя итогов) и поэтому может производиться параллельно, даже при полностью совпадающих значениях периода, счета и измерений. Но параллельность увеличивается для записи, не для чтения. Если нужно осуществлять чтение, то разделитель итогов смысла не имеет, потому что читать надо все итоги по данным значениям периода, счета и измерений. Чтобы не получить взаимоблокировку, необходимо пользоваться свойством БлокироватьДляИзменения, которое есть у набора записей регистра бухгалтерии/накопления. Таким образом, если идет чтение остатков, разделитель итогов параллельность не увеличивает.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.72

Вопрос 10.7
Какая схема представляет собой схему взаимоблокировки с установкой блокировок в различном порядке (T1,T2 – транзакции, S/X – разделяемая/исключительная, Р1,Р2 – ресурсы)?

1. Т1: S(P1) -> X(P1), T2: S(P1) -> X(P1).
2. T1: X(P1) -> S(P1+P2), T2: X(P2) -> S(P1+P2).
3. Т1: X(P1) -> X(P2), T2: X(P2) -> X(P1).
4. T1: S(P1) -> S(P2), T2: S(P2) -> S(P1).
5. Верны ответы 2 и 3.

Вопрос 10.8
Если взаимоблокировка возникает по причине попыток эскалаций блокировок СУБД SQL Server в двух параллельных транзакциях (наборы не пересекаются), какая это будет взаимоблокировка?

1. Захват ресурсов в разном порядке.
2. Повышение уровня блокировки ресурса.
3. Повышение уровня изоляции транзакции.
4. Взаимоблокировки не произойдет.

Эскалации бывают на СУБД и в менеджере управляемых блокировок. Их поведение различно. Различие состоит в том, что если в момент попытки эскалации на СУБД MS SQL кто-то другой будет держать блокировку, то эскалации не произойдет, но при этом транзакция дальше продолжит свое выполнение. Если в «1С» кто-то другой будет держать блокировку, то «эскалирующаяся» транзакция попадет в ожидание от всех, кто еще держит блокировки на этом ресурсе. Если в «1С» не получится проэскалироваться в течение N (по умолчанию 20) секунд, то транзакция получит таймаут.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.72

Вопрос 10.9
Если взаимоблокировка возникает по причине чтения остатков по регистру с включенным режимом разделения итогов после отмены проведения документов в двух параллельных транзакциях, какая это будет взаимоблокировка?

1. Захват ресурсов в разном порядке.
2. Повышение уровня блокировки ресурса.
3. Повышение уровня изоляции транзакции.
4. Снижение уровня изоляции транзакции.
5. Взаимоблокировки не произойдет.

Вопрос 10.10
Есть регистр сведений с подчинением регистратору и периодичностью по позиции регистратора. Два сеанса пытаются записать одинаковые значения измерений. Т.к. регистр с подчинением регистратору и периодичностью по позиции регистратора, то запись проходит успешно. Далее в транзакции оба сеанса хотят получить срез последних по измерению. Что произойдет? Используется платформа 8.2, управляемый режим управления блокировками, SQL Server.

1. Взаимоблокировка 1С «захват ресурсов в разном порядке».
2. Взаимоблокировка СУБД «захват ресурсов в разном порядке».
3. Взаимоблокировка 1С «повышение уровня блокировки ресурса».
4. Взаимоблокировка СУБД «повышение уровня блокировки ресурса».
5. Взаимоблокировки не будет.

Вопрос 10.11
Есть регистр сведений с подчинением регистратору и периодичностью по позиции регистратора. Два сеанса пытаются записать одинаковые значения измерений. Т.к. регистр с подчинением регистратору и периодичностью по позиции регистратора, то запись проходит успешно. Далее в транзакции оба сеанса хотят получить срез последних по измерению. Как предотвратить взаимоблокировку СУБД? Используется платформа 8.2, управляемый режим управления блокировками, SQL Server.

1. Ставить явную управляемую исключительную блокировку перед записью движений в базу. Это позволит организовать очередь.
2. Взаимоблокировки не будет.
3. Включить свойство «БлокироватьДляИзменения» используемого регистра сведений.
4. Не использовать Движения.Записать() в явном виде.

Вопрос 10.12
Отличие взаимоблокировки от таймаута:

1. при взаимоблокировке оба пересекающихся пользователя получат сообщение об ошибке, при таймауте — только один.
2. причиной взаимоблокировки, в отличие от таймаута, может являться недостаточная производительность оборудования.
3. при таймауте «жертва» получает сообщение об ошибке по умолчанию через 20 секунд, при взаимоблокировке — через 100 мс — 5 с, в некоторых случаях — немедленно.
4. длительность транзакций не влияет на вероятность возникновения взаимоблокировок, влияет только на вероятность возникновения таймаутов.

Вопрос 10.13
С помощью каких событий расследуется взаимоблокировка на управляемых блокировках?

1. TDEADLOCK и SDBL
2. DBMSSQL и TTIMEOUT
3. TLOCK и TDEADLOCK
4. EXCP и TDEADLOCK

Фактически журнал,настроенный на сбор событий TLOCK, TTIMEOUT и TDEADLOCK, является логом управляемых блокировок.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.263

Вопрос 10.14
Уменьшить вероятность возникновения взаимоблокировок могут следующие соглашения:

1. осуществлять доступ к объектам в разном порядке, избегать взаимодействия с пользователем в транзакциях, уменьшать длительность транзакций, использовать низкий уровень изоляции, использовать управление версиями строк.
2. осуществлять доступ к объектам в одинаковом порядке, избегать взаимодействия с пользователем в транзакциях, уменьшать длительность транзакций, блокировка в транзакции должна изначально осуществляться с максимально необходимым уровнем изоляции.
3. осуществлять доступ к объектам в одинаковом порядке, избегать взаимодействия с пользователем в транзакциях, уменьшать длительность транзакций, использовать как можно раньше минимальный уровень изоляции.

Для устранения взаимоблокировок нужно придерживаться следующих правил:

  • осуществлять запись ресурсов в одинаковом порядке;
  • избегать чтения ресурса после его записи, если включен режим разделения итогов; либо, если этого нельзя избежать, на время записи устанавливать свойство БлокироватьДляИзменения в Истину;
  • в режиме автоматического управления блокировками «1С» в запросах включать опцию ДЛЯ ИЗМЕНЕНИЯ на те ресурсы, которые будут потом записаны;
  • если есть необходимость поставить управляемую блокировку «1С» перед чтением данных ресурса, в который потом будет.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.64

Вопрос 10.15
В информации о событии TDEADLOCK:

1. в явном виде указано, кто кого ждет (DeadlockConnectionIntersections=’7 6).
2. указано, кого ждет жертва (WaitConnections=6).
3. не указано, кто кого ждет, эта информация есть только в сопутствующих TLOCK.

В информации о событии TDEADLOCK в явном виде указано, кто кого ждет (DeadlockConnectionIntersections=’7 6).

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.264

Вопрос 10.16
Наличие буквы «I» в графе взаимоблокировки SQL Server (напр. IX):

1. говорит о том, что пересеклись диапазоны ключей индекса.
2. говорит о том, что оптимизатор запроса не нашел подходящего индекса.
3. говорит о том, что это не первая взаимоблокировка, и детектор взаимоблокировок работает с увеличенной частотой.
4. говорит о том, что взаимоблокировка была распознана на уровне блокировок намерений.

Режим блокировки Intent — Блокировка с намерением (IS, IX, SIX).

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.61

Вопрос 10.17
Есть регистр сведений с подчинением регистратору и периодичностью по позиции регистратора. Два сеанса пытаются записать одинаковые значения измерений. Т.к. регистр с подчинением регистратору и периодичностью по позиции регистратора, то запись проходит успешно. Далее в транзакции оба сеанса хотят получить срез последних по измерению. Как предотвратить управляемую взаимоблокировку? Используется платформа 8.2, управляемый режим управления блокировками, SQL Server.

1. Ставить явную управляемую блокировку «для обновления» перед записью движений в базу. Это позволит организовать очередь.
2. Управляемой взаимоблокировки не будет, но будет взаимоблокировка на уровне СУБД
3. Включить свойство «БлокироватьДляИзменения».
4. Не использовать Движения.Записать() в явном виде.

Вопрос 10.18
Какой инструмент позволяет проводить расследование взаимоблокировок СУБД MS SQL Server?

1. Консоль кластера.
2. Технологический журнал.
3. ЦУП.
4. Профайлер SQL Server.
5. Верны ответы 3 и 4.
6. Верны ответы 2, 3, 4.

Вопрос 10.19
Укажите правильный порядок событий в технологическом журнале при возникновении взаимоблокировки на управляемых блокировках:

1. TLOCK-1 участника 1 …(возможно, другие TLOCK)… TLOCK-1 участника 2 …(возможно, другие TLOCK)… TDEADLOCK …(возможно, другие TLOCK)… TLOCK-2 участника 1 …(возможно, другие TLOCK)… TLOCK-2 участника 2
2. TLOCK-1 участника 1 …(возможно, другие TLOCK)… TLOCK-1 участника 2 …(возможно, другие TLOCK)… TLOCK-2 участника 1 TLOCK-2 участника 2 TDEADLOCK
3. TLOCK-1 участника 1 …(возможно, другие TLOCK)… TLOCK-1 участника 2 …(возможно, другие TLOCK)… TDEADLOCK TLOCK-2 участника 1 TLOCK-2 участника 2
4. TLOCK-1 участника 1 …(возможно, другие TLOCK)… TLOCK-1 участника 2 …(возможно, другие TLOCK)… TLOCK-2 участника 1 …(возможно, другие TLOCK)… TLOCK-2 участника 2 …(возможно, другие TLOCK)… TDEADLOCK

Вопрос 10.20
Есть регистр сведений с подчинением регистратору и периодичностью по позиции регистратора. Два сеанса пытаются записать одинаковые значения измерений. Т.к. регистр с подчинением регистратору и периодичностью по позиции регистратора, то запись проходит успешно. Далее в транзакции оба сеанса хотят получить срез последних по измерению. Как предотвратить взаимоблокировку СУБД? Используется платформа 8.3, управляемый режим управления блокировками, PostgreSQL.

1. Ставить явную управляемую блокировку «для обновления» перед записью движений в базу. Это позволит организовать очередь.
2. Управляемой взаимоблокировки не будет
3. Включить свойство «БлокироватьДляИзменения».
4. Не использовать Движения.Записать() в явном виде.

Комментарии

7 комментариев к “«1С:Профессионал» по технологическим вопросам (Раздел 10)”
  1. Михаил:

    Вопрос 10.20 — не понял, как связаны вопрос и ответ

    • Михаил:

      Тут всё правильно

    • Методом исключения. Остальные ответы еще меньше подходят.

      • Максим:

        10.20 — практически полный аналог 10.11. Там только 8.2 и SQL, а в 10.20 8.3 и Postgre. Но, согласно учебнику в обоих случаях используется изоляция Read Commited. Думаю, здесь больше подходит 1. «Ставить явную управляемую блокировку «для обновления» перед записью движений в базу. Это позволит организовать очередь.». Чем этот вариант Вас смущает? Термином «блокировка для обновления»? Думаю, это просто то же самое что и блокировка исключительная, т..е. подменой терминов вводят в заблуждение.

        • PostgreSQL версионник.

        • Илья:

          Postgre в управляемых блокировках использует уровень ReadCommited, но поскольку он «версионник», то его поведение будет аналогично уровню Read commited snapshot isolation.

          • Александр:

            В учебном тестировании на вопрос 10.20 сейчас (2017.04.13) нет ответа «Управляемой взаимоблокировки не будет», а есть ответ «Взаимоблокировки не будет». Этот ответ правильный.

Оставьте комментарий

Top