1С конфликт блокировок при выполнении транзакции: Конфликт блокировок при выполнении транзакции в 1С

Содержание

Конфликт блокировок при выполнении транзакции 1С 8.3 как исправить?

1С представляет собой сложную систему, в которой есть огромное количество настроек, особенностей и нюансов. А чем сложнее система, тем выше вероятность возникновения ошибок и проблем, решать которые приходится бухгалтерам, кассирам и другим сотрудникам, которые работают на 1С. Либо можно дождаться программиста 1С. Хорошо, если в компании есть свой IT-отдел, когда программисту достаточно только перейти на другой этаж, чтобы решить вашу проблему. Но если этого нет, то приходится ждать решения проблемы долгое время, ожидая специалиста со стороны.

В этой статье мы рассмотрим появление ошибки «Конфликт блокировок при выполнении транзакции» в 1С 8.3. Вы узнаете, как можно попытаться исправить её самостоятельно и быстро, без ожидания стороннего специалиста.

Содержание

  1. От чего возник конфликт блокировок проведения транзакции
  2. О конфликте блокировок при выполнении транзакции вы также можете узнать в видео ниже:
  3. Перевод управления блокировками в ручной режим
  4. Отключение других пользователей от 1С
  5. Как сделать, чтобы ошибка конфликта блокировок при выполнении транзакции больше не появлялась в 1С 8. 3

От чего возник конфликт блокировок проведения транзакции

Как было уже сказано: 1С — это сложная система. И она усложняется тем больше, чем больше количество её пользователей в компании. Чем больше сотрудников обращаются к общему серверу 1С для выполнения своей работы, тем больше операций нужно выполнять системе одновременно, и тем выше вероятность появления ошибок.

Когда речь идёт о серверной версии в большой компании, одновременно работать с документами может десятки и даже сотни сотрудников. Среди этих людей могут быть и те, кто работает с документом, например, касающимся одного сотрудника. Допустим, один начисляет ему зарплату, второй налоги, третий высчитывает больничный. Для того, чтобы гарантировать правильность таких вычислений, система 1С будет работать с документами по отдельности, в разное время, даже если сотрудники выполняют операции одновременно.

Вам может быть это интересно: Преобразование значения к типу Число не может быть выполнено 1С 8. 3 — как исправить?

Таким образом, один сотрудник начислит зарплату и проведёт документ. Пока система не вычислит это, документ второго сотрудника, который насчитывает налог, не будет проведён и окажется в очереди, то есть временно заблокированным. Когда третий сотрудник насчитает выплаты по больничным, он также встанет в очередь на проведение, после документа по начислениям зарплаты и налогов, то есть тоже будет временно заблокирован.

Так вот, когда этих блокировок становится слишком много, когда время блокировки увеличивается до неадекватного, 1С выдаёт ошибку конфликта блокировок при проведении транзакции. Зная природу этой проблемы, можно попытаться решить её.

О конфликте блокировок при выполнении транзакции вы также можете узнать в видео ниже:

Перевод управления блокировками в ручной режим

Ручной (или управляемый) режим отключит у системы необходимость включения блокировок документов, если им пользуется два или более сотрудников одновременно. Таким образом, сообщение о конфликте блокировок при выполнении транзакции исчезнет и всё заработает.

Но ведь блокировки устанавливаются не просто так. Как мы описали выше, они необходимы для того, чтобы гарантировать верное вычисление всех документов. Поэтому, с переводом управления блокировками в ручной режим вы не только избавитесь от конфликта блокировок транзакции, но ещё и увеличите риск появления неверных вычислений.

Метод подходит в случае, если решить проблему нужно срочно, и вероятность ошибок вычислений низка. Например, если есть возможность попросить всех сотрудников, имеющих доступ к 1С, временно не пользоваться программой и не проводить никакие документы.

Чтобы исключить риск неправильных вычислений, лучше всего проверить после этого всё вручную.

Отключение других пользователей от 1С

  1. Как мы поняли выше, «Конфликт блокировок при выполнении транзакции» вызываются тем, что несколько пользователей работают с одним документом.
  2. Таким образом, если этих пользователей отключить, то можно будет снять очередь на проведение документов и и провести свой документ, который ранее был заблокирован.
  3. Этот метод подойдёт в том случае, если у вас в системе 1С есть права на просмотр пользователей, работающих с тем же документом, что и вы, и возможность завершения их сеансов.
  4. Завершив их сеанс, вы можете провести свои вычисления без блокировок.

Тут также есть риск появления ошибок. Ведь другие пользователи в момент завершения их сеансов, могли выполнять какие важные операции в документе. И после их выхода их системы эти вычисления останутся незавершёнными и не сохранёнными.

И также рекомендуется всё проверить после завершения проводки.

Как сделать, чтобы ошибка конфликта блокировок при выполнении транзакции больше не появлялась в 1С 8.3

Описанные выше два способа подходят лишь как временные варианты, как говорится «поставить систему на костыли». То есть, можно быстро решить проблему, чтобы выполнить срочные действия, но всегда так делать не получится. Не будете ведь вы всегда переводить систему в ручной режим с рисками для вычисления операций, и не станете каждый раз отключать сеансы других пользователей, которые тоже могут быть заняты важной работой

.

Чтобы навсегда избавиться от конфликта блокировок при выполнении транзакции, следуют уже пригласить программиста, так как для этого потребуется специальный опыт.

Проблема может заключаться в следующем:

  • Система не оптимизирована и посылает к базе данных слишком большое количество запросов, которые нагружают её;
  • Система запрашивает остатки вначале вычислений;
  • В системе установлены излишние блокировки, которые срабатывают тогда, когда не нужно.

Могут быть и другие причины.

Конфликт блокировок при выполнении транзакции 1С 8.3

Не редко при работе в 1С возникает ошибка «Конфликт блокировок при выполнении транзакций: Превышено максимальное время ожидания предоставления блокировки». Суть ее кроется в том, что несколько сеансов пытаются одновременно выполнить похожие действия, затрагивая один и тот же ресурс. Сегодня мы разберемся как исправить данную ошибку

Содержание

  • Причины и способы решения проблемы
    • Большое количество выполняемых операций
    • Регламентные задания
    • «Зависшие сеансы»
    • Ошибки при написании конфигурации

Большое количество выполняемых операций

Первым делом при поиске причин следует уточнить, сколько же одновременно работающих пользователей находится в той информационной базе, в которой выдается подобная ошибка. Как мы знаем, максимальное их количество может быть довольно большим. Это и тысяча, и пять тысяч.

Механизм блокировок и транзакций описан в руководстве разработчика. Их используют при обращении нескольких сеансов к одним и тем же данным одновременно. Логично, что одни и те же данные не могут изменяться разными пользователями в один и тот же момент.

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

Регламентные задания

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!


Не редки случаи, когда причина ошибки кроется в регламентном задании, которое обрабатывает большое количеств данных. Рекомендуется подобные вещи делать ночью. Задайте расписание выполнение таких регламентных заданий во внерабочее время.

Таким образом, и пользователи будут работать в стабильной системе, и сами регламентные задания будут завершаться успешно, так как снизится вероятность возникновения конфликтов с пользовательскими сеансами.

«Зависшие сеансы»

Проблема «зависших сеансов» пользователей знакома практически каждому, кто сталкивался с обслуживанием 1С. Пользователь мог уже давно выйти из программы, или закрыть какой-либо документ, но его сеанс по-прежнему остается в системе. Проблема чаще всего единичная и достаточно завершить подобный сеанс через консоль администратора. Такие же проблемы могут возникнуть и с фоновыми заданиями.

По многочисленным комментариям на просторах интернета подобные ситуации чаще встречаются при использовании сетевых ключей защиты. Если ситуация с «зависающими сеансами» повторяется систематически, это причина произвести тщательную проверку и обслуживание системы и серверов (если база клиент-серверная).

Ошибки при написании конфигурации

Все типовые конфигурации разработаны квалифицированными специалистами и экспертами. Каждая система тщательно тестируется и оптимизируется для более быстрой и корректной работы в ней.

Получите понятные самоучители по 1С бесплатно:

  • Самоучитель по 1С Бухгалтерии 8.3;
  • Самоучитель по 1С ЗУП 8.3.

В связи с этим причина ошибки может крыться в неоптимальном коде, написанном сторонним разработчиком. Это может быть «тяжелый» запрос, который будет блокировать данные на длительный промежуток времени. Так же нередки случаи построения алгоритмов с низкой производительностью и нарушением логики.

Большая вероятность, что конфликт блокировки возник именно из-за ошибок разработчика, если он возник после обновления программы. Для проверки можно просто «откатить» доработки, либо произвести рефакторинг кода.

Устранение конфликтов блокировки | PingCAP Docs

TiDB поддерживает полные распределенные транзакции. Начиная с версии 3.0, TiDB предоставляет режим оптимистичных транзакций и режим пессимистичных транзакций. В этом документе описывается, как использовать Lock View для устранения проблем с блокировкой и как справляться с общими проблемами конфликтов блокировки в оптимистичных и пессимистичных транзакциях.

Используйте Lock View для устранения проблем с блокировкой

Начиная с v5.1, TiDB поддерживает функцию Lock View. Эта функция имеет несколько системных таблиц, встроенных в information_schema , которые предоставляют дополнительную информацию о конфликтах блокировок и ожиданиях блокировок.

Подробное описание этих таблиц см. в следующих документах:

  • TIDB_TRX и CLUSTER_TIDB_TRX : Предоставляет информацию обо всех запущенных транзакциях на текущем узле TiDB или во всем кластере, в том числе о том, находится ли транзакция в состояние ожидания блокировки, время ожидания блокировки и дайджесты операторов, которые были выполнены в транзакции.
  • DATA_LOCK_WAITS : Предоставляет пессимистическую информацию об ожидании блокировки в TiKV, включая start_ts блокирующей и заблокированной транзакции, дайджест заблокированного оператора SQL и ключ, по которому происходит ожидание.
  • DEADLOCKS и CLUSTER_DEADLOCKS : Предоставляет информацию о нескольких событиях взаимоблокировки, которые недавно произошли на текущем узле TiDB или во всем кластере, включая отношения ожидания между транзакциями в циклах взаимоблокировки, дайджест оператора, который в настоящее время выполняется. выполняется в транзакции, и ключ, на котором происходит ожидание.

В следующих разделах показаны примеры устранения некоторых проблем с использованием этих таблиц.

Ошибки взаимоблокировки

Чтобы получить информацию о последних ошибках взаимоблокировки, можно запросить таблицу DEADLOCKS или CLUSTER_DEADLOCKS .

Например, чтобы запросить таблицу DEADLOCKS , можно выполнить следующую инструкцию SQL:

 select * from information_schema. deadlocks;
 

Ниже приведен пример вывода:

 +--------------+--------------+---- ----------------------+--------------------+------- -----------------------------------------------------------+---- ----------------------+--------------------------- ----------------------------+------- -------------------------------------------------- -----------------------------+-------------------- +
| ИДЕНТИФИКАТОР БЛОКА | OCCUR_TIME | ПОВТОРНАЯ | TRY_LOCK_TRX_ID | CURRENT_SQL_DIGEST | CURRENT_SQL_DIGEST_TEXT | КЛЮЧ | KEY_INFO | TRX_HOLDING_LOCK |
+-------------+-----------------------------+------ -----+-----------------------------------+--------- ----------------------------------------------------------+------ -----------------------------------+----------------------------- --------------------------+----------------------- -------------------------------------------------- ---------------------------+------+
| 1 | 2021-08-05 11:09:03.230341 | 0 | 426812829645406216 | 22230766411edb40f27a68dadefc63c6c6970d5827f1e5e22fc97be2c4d8350d | обновить `t` установить `v` = ? где `id` = ? ; | 7480000000000000355F728000000000000002 | {"db_id":1,"db_name":"test","table_id":53,"table_name":"t","handle_type":"int","handle_value":"2"} | 426812829645406217 |
| 1 | 2021-08-05 11:09:03.
230341 | 0 | 426812829645406217 | 22230766411edb40f27a68dadefc63c6c6970d5827f1e5e22fc97be2c4d8350d | обновить `t` установить `v` = ? где `id` = ? ; | 7480000000000000355F7280000000000000001 | {"db_id":1,"db_name":"test","table_id":53,"table_name":"t","handle_type":"int","handle_value":"1"} | 426812829645406216 | +-------------+-----------------------------+------ -----+-----------------------------------+--------- ----------------------------------------------------------+------ -----------------------------------+----------------------------- --------------------------+----------------------- -------------------------------------------------- ---------------------------+------+

Приведенный выше результат запроса показывает взаимосвязь ожидания между несколькими транзакциями при ошибке взаимоблокировки, нормализованную форму операторов SQL, выполняемых в настоящее время в каждой транзакции (операторы без форматов и аргументов), ключ, по которому возникает конфликт, и информацию ключа.

Например, в приведенном выше примере первая строка означает, что транзакция с идентификатором 426812829645406216 выполняет оператор типа update `t` set `v` =? Где `id` =? ; , но заблокирован другой транзакцией с идентификатором 426812829645406217

. Транзакция с идентификатором 426812829645406217 также выполняет оператор в форме update `t` set `v` =? Где `id` =? ; , но заблокирован транзакцией с идентификатором 426812829645406216 . Таким образом, две транзакции образуют взаимоблокировку.

Несколько горячих клавиш вызывают блокировку очереди

Системная таблица DATA_LOCK_WAITS предоставляет статус ожидания блокировки на узлах TiKV. Когда вы запрашиваете эту таблицу, TiDB автоматически получает информацию об ожидании блокировки в реальном времени со всех узлов TiKV. Если несколько горячих клавиш часто блокируются и блокируют множество транзакций, вы можете запросить таблицу DATA_LOCK_WAITS и агрегировать результаты по ключу, чтобы попытаться найти ключи, с которыми часто возникают проблемы:

 выберите `key`, count(*) как `count` из группы information_schema.
data_lock_waits по `key` в порядке `count` desc;

Ниже приведен пример вывода:

 +----------------------------------------------------- --+-------+
| ключ | считать |
+------------------------------------------------------+--------+
| 7480000000000000415F7280000000000000001 | 2 |
| 7480000000000000415F7280000000000000002 | 1 |
+------------------------------------------------------+--------+
 

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

Если вы знаете ключ, с которым часто возникают проблемы, вы можете попытаться получить информацию о транзакции, которая пытается заблокировать ключ, из таблицы TIDB_TRX или CLUSTER_TIDB_TRX .

Обратите внимание, что информация, отображаемая в таблицах TIDB_TRX и CLUSTER_TIDB_TRX , также является информацией о транзакциях, которые выполняются во время выполнения запроса. В этих таблицах не отображается информация о совершенных транзакциях.

При наличии большого количества одновременных транзакций результирующий набор запроса также может быть большим. Вы можете использовать 9Предложение 0007 limit или предложение where для фильтрации транзакций с длительным временем ожидания блокировки. Обратите внимание, что при объединении нескольких таблиц в представлении блокировки данные в разных таблицах могут быть получены не одновременно, поэтому информация в разных таблицах может быть несогласованной.

Например, для фильтрации транзакций с длительным временем ожидания блокировки с помощью предложения where можно выполнить следующую инструкцию SQL: l.trx_id = trx.id, где l.key = «74800000000000000415F7280000000000000001″\G

Ниже приведен пример вывода:

 **************************** 1. строка ********** ******************
                     ID: 426831815660273668
             START_TIME: 06.08.2021 07:16:00.081000
     ТЕКУЩИЙ_SQL_DIGEST: 06da614b93e62713bd282d4685fc5b88d688337f36e88fe55871726ce0eb80d7
CURRENT_SQL_DIGEST_TEXT: обновить `t` установить `v` = `v` + ? где `id` = ? ;
                  СОСТОЯНИЕ: Ожидание блокировки
     WAITING_START_TIME: 06.
08.2021 07:16:00.087720 MEM_BUFFER_KEYS: 0 MEM_BUFFER_BYTES: 0 ИДЕНТИФИКАТОР_СЕССИИ: 77 ПОЛЬЗОВАТЕЛЬ: корень БД: тест ALL_SQL_DIGESTS: ["0fdc781f19da1c6078c9de7eadef8a307889c001e05f107847bee4cfc8f3cdf3","06da614b93e62713bd282d4685fc5b88d688337f36e88fe55871726ce0eb80d7"] *************************** 2-й ряд ********************** ******* ID: 426831818019569665 START_TIME: 06.08.2021 07:16:09.081000 ТЕКУЩИЙ_SQL_DIGEST: 06da614b93e62713bd282d4685fc5b88d688337f36e88fe55871726ce0eb80d7 CURRENT_SQL_DIGEST_TEXT: обновить `t` установить `v` = `v` + ? где `id` = ? ; СОСТОЯНИЕ: Ожидание блокировки WAITING_START_TIME: 06.08.2021, 07:16:09.2
MEM_BUFFER_KEYS: 0 MEM_BUFFER_BYTES: 0 ИДЕНТИФИКАТОР_СЕССИИ: 75 ПОЛЬЗОВАТЕЛЬ: корень БД: тест ALL_SQL_DIGESTS: ["0fdc781f19da1c6078c9de7eadef8a307889c001e05f107847bee4cfc8f3cdf3","06da614b93e62713bd282d4685fc5b88d688337f36eb88dfe558718026ce"06da614b93e62713bd282d4685fc5b88d688337f36eb88dfe558718026ce" 2 ряда в наборе (0,00 сек)

Транзакция заблокирована на длительное время

Если известно, что транзакция заблокирована другой транзакцией (или несколькими транзакциями) и 0007 start_ts (идентификатор транзакции) текущей транзакции известен, вы можете использовать следующий метод для получения информации о блокирующей транзакции. Обратите внимание, что при объединении нескольких таблиц в представлении блокировки данные в разных таблицах могут быть получены не одновременно, поэтому информация в разных таблицах может быть несогласованной.

 выберите l.key, trx.*, tidb_decode_sql_digests(trx.all_sql_digests) как sqls из information_schema.data_lock_waits, поскольку l присоединитесь к information_schema.cluster_tidb_trx как trx на l.current_holding_trx_id = trx.id, где l.trx_id = 426831965449355272\Г
 

Ниже приведен пример вывода:

 *************************** 1. строка ********** ******************
                    ключ: 74800000000000004D5F7280000000000000001
               ИНСТАНЦИЯ: 127.0.0.1:10080
                     ID: 426832040186609668
             START_TIME: 06.08.2021 07:30:16.581000
     ТЕКУЩИЙ_SQL_DIGEST: 06da614b93e62713bd282d4685fc5b88d688337f36e88fe55871726ce0eb80d7
CURRENT_SQL_DIGEST_TEXT: обновить `t` установить `v` = `v` + ? где `id` = ? ;
                  СОСТОЯНИЕ: Ожидание блокировки
     WAITING_START_TIME: 06.
08.2021 07:30:16.592763 MEM_BUFFER_KEYS: 1 MEM_BUFFER_BYTES: 19 ИДЕНТИФИКАТОР_СЕССИИ: 113 ПОЛЬЗОВАТЕЛЬ: корень БД: тест ALL_SQL_DIGESTS: ["0fdc781f19da1c6078c9de7eadef8a307889c001e05f107847bee4cfc8f3cdf3","a4e28cc182bdd18288e2a34180499b9404cd0ba07e3cc34b6b3be7b7c2de7fe9","06da614b93e62713bd282d4685fc5b88d688337f36e88fe55871726ce0eb80d7"] sqls: ["begin;", "выберите * из `t`, где `id` = ? для обновления;", "обновите `t`, установите `v` = `v` + ?, где `id` = ? ;"] 1 ряд в сете (0,01 сек)

В приведенном выше запросе функция TIDB_DECODE_SQL_DIGESTS используется для столбца ALL_SQL_DIGESTS таблицы CLUSTER_TIDB_TRX . Эта функция пытается преобразовать этот столбец (значение представляет собой набор дайджестов SQL) в нормализованные операторы SQL, что улучшает читаемость.

Если start_ts текущей транзакции неизвестен, можно попытаться узнать его из информации в TIDB_TRX / CLUSTER_TIDB_TRX или в таблице PROCESSLIST / CLUSTER_PROCESSLIST .

Устранение неполадок с оптимистичными конфликтами блокировок

В этом разделе приведены решения распространенных проблем с конфликтами блокировок в режиме оптимистичных транзакций.

Конфликты чтения-записи

Когда сервер TiDB получает запрос на чтение от клиента, он получает глобально уникальную и увеличивающуюся метку времени в физическом времени в качестве start_ts текущей транзакции. Транзакция должна прочитать последние данные перед start_ts, то есть целевой ключ последнего commit_ts, который меньше, чем start_ts. Когда транзакция обнаруживает, что целевой ключ заблокирован другой транзакцией, и не может знать, в какой фазе находится другая транзакция, возникает конфликт чтения-записи. Схема выглядит следующим образом:

Txn0 завершает фазу предварительной записи и переходит в фазу фиксации. В это время Txn1 запрашивает чтение того же целевого ключа. Txn1 должен прочитать целевой ключ последнего commit_ts, который меньше его start_ts. Поскольку start_ts Txn1 больше, чем lock_ts Txn0, Txn1 должен дождаться снятия блокировки целевого ключа, но этого не произошло. В результате Txn1 не может подтвердить, был ли зафиксирован Txn0 или нет. Таким образом, возникает конфликт чтения-записи между Txn1 и Txn0.

Вы можете обнаружить конфликт чтения-записи в вашем кластере TiDB следующими способами:

  1. Мониторинг метрик и журналов сервера TiDB

    • Мониторинг данных через Grafana

      В KV Errors на панели Панель мониторинга TiDB, not_expired / Resolve в Lock Resolve OPS и tikvLockFast в KV Backoff OPS — это метрики мониторинга, которые можно использовать для проверки конфликтов чтения и записи в транзакциях. Если значения всех метрик увеличиваются, может возникнуть много конфликтов чтения-записи. 9Элемент 0007 not_expired означает, что время блокировки транзакции не истекло. Элемент разрешить означает, что другая транзакция пытается очистить блокировки. Пункт tikvLockFast означает, что возникают конфликты чтения-записи.

    • Журналы сервера TiDB

      При возникновении конфликта чтения-записи в журнале TiDB можно увидеть следующее сообщение:

       [INFO] [coprocessor.go:743] ["[TIME_COP_PROCESS] время_ответа: 406.038899ms txnStartTS:416643508703592451 region_id:8297 store_addr:10.8.1.208:20160 backoff_ms:255 backoff_types:[txnLockFast,txnLockFast] kv_process_ms:333 scan_total_write:0 scan_processed_write:0 scan_total_data:0 scan_processed_data:0 scan_total_lock:0 scan_processed_lock:0"]
       
      • txnStartTS: start_ts транзакции, отправляющей запрос на чтение. В приведенном выше журнале 416643508703592451 — это start_ts.
      • backoff_types: если возникает конфликт чтения-записи, и запрос на чтение выполняет отсрочку и повторную попытку, тип повторной попытки — TxnLockFast .
      • backoff_ms: Время, в течение которого запрос на чтение находится в состоянии отсрочки и повторной попытки, в миллисекундах. В приведенном выше журнале запрос на чтение тратит 255 миллисекунд на отсрочку и повторную попытку.
      • region_id: идентификатор региона, соответствующий целевому ключу запроса на чтение.
  2. Журналы сервера TiKV

    При возникновении конфликта чтения-записи в журнале TiKV можно увидеть следующее сообщение:

     [ОШИБКА] [endpoint.rs:454] [отклик на ошибку ] [err=""заблокировано primary_lock:7480000000000004D35F6980000000000000010380000000004C788E0380000000004C0748 lock_version: 411402933858205712 ключ: 74800000000000004D35F72800000000004C0748 lock_ttl: "t x 3008]
     

    Это сообщение указывает на конфликт чтения-записи в TiDB. Целевой ключ запроса на чтение заблокирован другой транзакцией. Блокировки связаны с незафиксированной оптимистичной транзакцией и незафиксированной пессимистичной транзакцией после фазы предварительной записи.

    • primary_lock: Указывает, что целевой ключ заблокирован основной блокировкой.
    • lock_version: start_ts транзакции, которой принадлежит блокировка.
    • ключ: целевой ключ, который заблокирован.
    • lock_ttl: TTL блокировки (время жизни)
    • txn_size: количество ключей в регионе транзакции, которой принадлежит блокировка.

Решения:

  • Конфликт чтения-записи вызывает автоматическую отсрочку и повторную попытку. Как и в приведенном выше примере, Txn1 имеет отсрочку и повторную попытку. Время первой повторной попытки составляет 10 мс, самая длинная повторная попытка — 3000 мс, а общее время — не более 20000 мс.

  • Вы можете использовать подкоманду decoder TiDB Control для просмотра идентификатора таблицы и rowid строки, соответствующей указанному ключу:

     ./tidb-ctl decoder "t\x00\x00\x00\ x00\x00\x00\x00\x1c_r\x00\x00\x00\x00\x00\x00\x00\xfa"
    формат: таблица_строка
    table_id: -9223372036854775780
    row_id: -9223372036854775558
     

Ошибка KeyIsLocked

На этапе предварительной записи транзакции TiDB проверяет наличие конфликта записи и записи, а затем проверяет, не был ли целевой ключ заблокирован другой транзакцией. Если ключ заблокирован, сервер TiKV выдает ошибку «KeyIsLocked». В настоящее время сообщение об ошибке не печатается в журналах TiDB и TiKV. Как и в случае с конфликтами чтения-записи, при возникновении «KeyIsLocked» TiDB автоматически выполняет отсрочку и повторяет попытку транзакции.

Вы можете проверить, есть ли какая-либо ошибка «KeyIsLocked» в мониторинге TiDB на Grafana:

Панель KV Errors на панели управления TiDB имеет две метрики мониторинга Lock Resolve OPS и KV Backoff OPS , которые можно использовать для проверки конфликтов записи-записи, вызванных транзакцией. Если элемент Resolve под Lock Resolve OPS и элемент txnLock под KV Backoff OPS имеют четкую восходящую тенденцию, возникает ошибка «KeyIsLocked». разрешение относится к операции, которая пытается снять блокировку, а txnLock представляет конфликт записи.

Решения:

  • Если в мониторинге есть небольшое количество txnLock, не нужно уделять слишком много внимания. Отсрочка и повторная попытка автоматически выполняются в фоновом режиме. Время первой повторной попытки составляет 100 мс, а максимальное время — 3000 мс для одной повторной попытки.
  • Если слишком много операций "txnLock" в KV Backoff OPS , рекомендуется проанализировать причины конфликтов записи со стороны приложения.
  • Если ваше приложение представляет собой сценарий конфликта записи-записи, настоятельно рекомендуется использовать режим пессимистичных транзакций.

Ошибка LockNotFound

Журнал ошибок "TxnLockNotFound" означает, что время фиксации транзакции больше, чем время TTL, и когда транзакция будет зафиксирована, ее блокировка была отменена другими транзакциями. Если сервер TiDB разрешает повторную попытку фиксации транзакции, эта транзакция выполняется повторно в соответствии с tidb_retry_limit. (Обратите внимание на разницу между явными и неявными транзакциями.)

Проверить наличие ошибки «LockNotFound» можно следующими способами:

  1. Просмотр журналов сервера TiDB

    Если возникает ошибка «TxnLockNotFound», сообщение журнала TiDB выглядит следующим образом:

     [ WARN] [session. go:446] ["сбой фиксации"] [conn=149370] ["законченный txn"="Txn{state=invalid}"] [error="[kv:6]Ошибка: ошибка KV безопасна для повторите попытку tikv перезапускает txn: Txn(Mvcc(TxnLockNotFound{ start_ts: 412720515987275779, commit_ts: 412720519984971777, ключ: [116, 128, 0, 0, 0, 0, 1, 111, 16, 95, 114, 128, 0, 0, 0, 0, 0, 0, 2] })) [попробуйте позже]"]
     
    • start_ts: start_ts транзакции, которая выводит ошибку TxnLockNotFound , так как ее блокировка была отменена другими транзакциями. В приведенном выше журнале 412720515987275779 — это start_ts.
    • commit_ts: commit_ts транзакции, которая выводит ошибку TxnLockNotFound . В приведенном выше журнале 412720519984971777 — это файл commit_ts.
  2. Просмотр журналов сервера TiKV

    Если возникает ошибка «TxnLockNotFound», сообщение журнала TiKV выглядит следующим образом:

     Ошибка: ошибка KV, безопасный повторный перезапуск txn: Txn(Mvcc(TxnLockNotFound)) [ERROR [Kv . rs:708] ["KvService::batch_raft не удалось отправить ответ"] [err=RemoteStoped]
     

Решения:

  • Проверяя временной интервал между start_ts и commit_ts, вы можете убедиться, что время фиксации превышает время TTL.

    Проверка временного интервала с помощью инструмента ПД-контроля:

     tiup ctl:v pd tso [start_ts]
    tiup ctl:v pd tso [commit_ts]
     
  • Рекомендуется проверить, не является ли производительность записи низкой, что может привести к снижению эффективности фиксации транзакции и, таким образом, снятию блокировки.

  • В случае отключения повтора транзакции TiDB необходимо перехватить исключение на стороне приложения и повторить попытку.

Устранение неполадок с пессимистическими блокировками

В этом разделе представлены решения распространенных проблем с конфликтами блокировок в режиме пессимистичных транзакций.

Конфликты чтения-записи

Сообщения об ошибках и решения аналогичны конфликту чтения-записи для оптимистического конфликта блокировки.

Достигнут лимит повторных попыток пессимистической блокировки

Когда конфликт транзакций очень серьезный или возникает конфликт записи, оптимистичная транзакция будет завершена напрямую, а пессимистическая транзакция будет повторять оператор с последними данными из хранилища до тех пор, пока конфликт записи не исчезнет .

Поскольку операция блокировки TiDB является операцией записи, а процесс операции состоит в том, чтобы сначала прочитать, а затем записать, имеется два запроса RPC. Если в середине транзакции возникает конфликт записи, TiDB снова попытается заблокировать целевые ключи, и каждая повторная попытка будет напечатана в журнале TiDB. Количество повторных попыток определяется пессимистическим-txn.max-retry-count.

В режиме пессимистической транзакции, если возникает конфликт записи и количество повторных попыток достигает верхнего предела, в журнале TiDB появляется сообщение об ошибке, содержащее следующие ключевые слова:

 err="достигнут предел пессимистичных попыток блокировки"
 

Решения:

  • Если указанная выше ошибка возникает часто, рекомендуется выполнить настройку со стороны приложения.
  • Если в вашем бизнесе используется высокая одновременная блокировка одной и той же строки (одного и того же ключа) и возникают частые конфликты, вы можете попробовать включить системную переменную tidb_pessimistic_txn_aggressive_locking . Обратите внимание, что включение этой переменной может привести к некоторым затратам на снижение пропускной способности (увеличение средней задержки) для транзакций с конфликтами блокировок.

Превышено время ожидания блокировки

В режиме пессимистичных транзакций транзакции ожидают блокировки друг друга. Время ожидания блокировки определяется параметром innodb_lock_wait_timeout TiDB. Это максимальное время ожидания блокировки на уровне инструкции SQL, которое является ожиданием блокировки инструкции SQL, но блокировка так и не была получена. По истечении этого времени TiDB больше не будет пытаться выполнить блокировку и вернет клиенту соответствующее сообщение об ошибке.

При истечении времени ожидания блокировки клиенту будет возвращено следующее сообщение об ошибке:

 ОШИБКА 1205 (HY000): превышено время ожидания блокировки; попробуйте перезапустить транзакцию
 

Решения:

  • Если вышеуказанная ошибка возникает часто, рекомендуется настроить логику приложения.

Тайм-аут менеджера TTL

Время выполнения транзакции не может превышать лимит времени GC. Кроме того, время TTL пессимистичных транзакций имеет верхний предел, значение которого по умолчанию составляет 1 час. Следовательно, пессимистичная транзакция, выполняемая более 1 часа, не будет зафиксирована. Этот порог тайм-аута контролируется параметром TiDB performance.max-txn-ttl.

Когда время выполнения пессимистической транзакции превышает время TTL, в журнале TiDB появляется следующее сообщение об ошибке:

 Время ожидания менеджера TTL истекло, срок действия пессимистических блокировок может истечь, зафиксируйте или отмените эту транзакцию
 

Решения:

  • Сначала проверьте, можно ли оптимизировать логику приложения. Например, большие транзакции могут вызвать ограничение размера транзакции TiDB, которое можно разделить на несколько небольших транзакций.
  • Кроме того, вы можете правильно настроить соответствующие параметры в соответствии с логикой транзакций приложения.

При попытке получить блокировку обнаружена взаимоблокировка

Из-за конкуренции за ресурсы между двумя или более транзакциями возникает взаимоблокировка. Если вы не справитесь с этим вручную, транзакции, которые блокируют друг друга, не могут быть успешно выполнены и будут ждать друг друга вечно. Для устранения взаимоблокировок необходимо вручную завершить одну из транзакций, чтобы возобновить другие запросы транзакций.

Когда пессимистическая транзакция зашла в тупик, одна из транзакций должна быть завершена, чтобы разблокировать тупик. Клиент вернет те же Ошибка 1213 ошибка как в MySQL, например:

 [err="[executor:1213]Взаимоблокировка при попытке получить блокировку; попробуйте перезапустить транзакцию"]
 

Решения:

  • Если трудно подтвердить причину взаимоблокировки, для v5.1 и более поздних версий рекомендуется попытаться запросить системную таблицу INFORMATION_SCHEMA.DEADLOCKS или INFORMATION_SCHEMA. CLUSTER_DEADLOCKS , чтобы получить информация о тупиковой цепочке ожидания. Для получения дополнительной информации см. раздел Ошибки взаимоблокировки и ТУПИКИ табличный документ.
  • Если взаимоблокировка возникает часто, вам необходимо настроить логику запроса транзакций в вашем приложении, чтобы уменьшить количество таких случаев.

Конфликты блокировок

Конфликт блокировок возникает, когда одна транзакция пытается установить монопольную блокировку на строку, на которую удерживает другую транзакцию, или пытается получить общую блокировку на строку, на которую другая транзакция удерживает монопольную блокировку.

Одна транзакция должна дождаться завершения другой транзакции. Транзакция, которая должна ждать, равна заблокировал другой транзакцией.

Сервер базы данных использует блокировки схемы, строки, таблицы и позиции по мере необходимости для обеспечения требуемого уровня согласованности. Вам не нужно явно запрашивать использование конкретной блокировки. Вместо этого вы контролируете уровень поддерживаемой согласованности, выбирая уровень изоляции, который лучше всего соответствует вашим требованиям. Знание типов блокировок поможет вам выбрать уровни изоляции и понять влияние каждого уровня на производительность. Имейте в виду, что ни одна транзакция не может заблокировать себя путем получения блокировок; конфликт блокировки может возникнуть только между двумя (или более) транзакциями.

Когда сервер базы данных обнаруживает конфликт блокировок, препятствующий немедленному выполнению транзакции, он может либо приостановить выполнение транзакции, либо завершить транзакцию, отменить любые изменения и вернуть ошибку. Вы контролируете маршрут, устанавливая опцию блокировки. Когда для блокировки установлено значение On, вторая транзакция ожидает.

Какие замки конфликтуют?

Хотя у каждого из четырех типов блокировок есть определенные цели, все типы взаимодействуют и, следовательно, могут вызвать конфликт блокировок между транзакциями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *