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С.

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

1c

Содержание

  • 1 Из-за чего появляется конфликт
  • 2 Распространенные причины конфликта блокировки в 1С
  • 3 Неверно написанная конфигурация
  • 4 Ручное управление блокировками
  • 5 Отключение пользователей
  • 6 Можно ли быстро разрешить конфликт блокирования
  • 7 Заключение

Из-за чего появляется конфликт

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

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

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

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

Конфликт блокировок при проведении транзакции

 

Распространенные причины конфликта блокировки в 1С

Среди основных причин можно выделить:

  1. Слишком большое количество одновременного выполняемых операций. Помимо основной причины, описанной выше, проблема может касаться и запущенного у кого-то из работников процесса обработки данных по массовому изменению. Может быть, кто-то запустил групповое проведение документов, закрытие месяца и иные процедуры. Если причина кроется в этом, то проблема разрешится сама по себе – сразу после того, как групповое проведение данных закончится.
  2. Регламентные задания. Также частой причиной появления конфликта является появление регламентное задание, в рамках которого обрабатывается очень много самых разных информационных данных. Для того, чтобы подобных проблем в течение рабочего дня не было, стоит выполнять регламентные задания ночью.
  3. Зависший сеанс. Не менее распространенная проблема «зависших сеансов» пользователей известна практически любой компании, работающей в 1С. Суть ее кроется в том, что пользователь мог уже давным-давно выйти из программы или же завершить работу с каким-либо документом, но сама система все равно не отключает его и думает, что он все еще находится внутри системы. Подобная проблема носит единичный характер и может быть разрешена с помощью администраторской консоли. Также та же проблема может появится при выполнении фоновых заданий. Еще, согласно комментариям, ситуации с зависшим сеансом встречаются при применении сетевых защитных ключей. Если «зависание» повторяется время от времени, необходимо проверить обслуживание серверов и системы.

Перечисленные причины и основные методы их решения являются самыми распространенными.

Неверно написанная конфигурация

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

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

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

Один из факторов того, что проблема кроется именно в неправильном коде – это то, что программа перестала работать как надо не спонтанно, а после одного из обновлений. В качестве средства проверки в таком случае можно откатить версию или заняться рефакторингом кода.

Ручное управление блокировками

При желании пользователь (лучше, чтобы это был администратор) может отключить в системе 1С функцию включения блокировок рабочих документов даже в том случае, если этими документами пользуется одновременно 2 или большее количество сотрудников. В таком случае проблем, связанных с конфликтом блокировок, не будет.

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

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

Ручной режим

Отключение пользователей

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

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

Можно ли быстро разрешить конфликт блокирования

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

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

Для того, чтобы быстро разрешить конфликт, связанный с блокированием 1С, можно пойти по одному из двух путей:

  1. Отыскать и принудительно завершить все те сеансы (или один сеанс), из-за которого необходимые документы и данные блокируются. В маленьких организациях, где суммарное количество сотрудников, работающих с 1С, не превышает 1-2 десятков граждан, завершение сеанса является оптимальным вариантом.
  2. Если есть доступ к системе и ее контролю, а в самой компании работает несколько сотен человек, решение проблемы может затянуться на несколько часов или, в худшем случае, на несколько дней. В такой ситуации оптимальным вариантом будет перезагрузка аппаратного обеспечения и серверного оборудования.

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

Заключение

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

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

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

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

Причины и способы решения проблемы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Из-за чего появляется конфликт

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

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

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

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

Конфликт блокировок при проведении транзакции

Распространенные причины конфликта блокировки в 1С

Среди основных причин можно выделить:

  1. Слишком большое количество одновременного выполняемых операций. Помимо основной причины, описанной выше, проблема может касаться и запущенного у кого-то из работников процесса обработки данных по массовому изменению. Может быть, кто-то запустил групповое проведение документов, закрытие месяца и иные процедуры. Если причина кроется в этом, то проблема разрешится сама по себе – сразу после того, как групповое проведение данных закончится.
  2. Регламентные задания. Также частой причиной появления конфликта является появление регламентное задание, в рамках которого обрабатывается очень много самых разных информационных данных. Для того, чтобы подобных проблем в течение рабочего дня не было, стоит выполнять регламентные задания ночью.
  3. Зависший сеанс. Не менее распространенная проблема «зависших сеансов» пользователей известна практически любой компании, работающей в 1С. Суть ее кроется в том, что пользователь мог уже давным-давно выйти из программы или же завершить работу с каким-либо документом, но сама система все равно не отключает его и думает, что он все еще находится внутри системы. Подобная проблема носит единичный характер и может быть разрешена с помощью администраторской консоли. Также та же проблема может появится при выполнении фоновых заданий. Еще, согласно комментариям, ситуации с зависшим сеансом встречаются при применении сетевых защитных ключей. Если «зависание» повторяется время от времени, необходимо проверить обслуживание серверов и системы.

Перечисленные причины и основные методы их решения являются самыми распространенными.

Неверно написанная конфигурация

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

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

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

Один из факторов того, что проблема кроется именно в неправильном коде – это то, что программа перестала работать как надо не спонтанно, а после одного из обновлений. В качестве средства проверки в таком случае можно откатить версию или заняться рефакторингом кода.

Ручное управление блокировками

При желании пользователь (лучше, чтобы это был администратор) может отключить в системе 1С функцию включения блокировок рабочих документов даже в том случае, если этими документами пользуется одновременно 2 или большее количество сотрудников. В таком случае проблем, связанных с конфликтом блокировок, не будет.

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

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

Отключение пользователей

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

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

Можно ли быстро разрешить конфликт блокирования

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

Для того, чтобы быстро разрешить конфликт, связанный с блокированием 1С, можно пойти по одному из двух путей:

  1. Отыскать и принудительно завершить все те сеансы (или один сеанс), из-за которого необходимые документы и данные блокируются. В маленьких организациях, где суммарное количество сотрудников, работающих с 1С, не превышает 1-2 десятков граждан, завершение сеанса является оптимальным вариантом.
  2. Если есть доступ к системе и ее контролю, а в самой компании работает несколько сотен человек, решение проблемы может затянуться на несколько часов или, в худшем случае, на несколько дней. В такой ситуации оптимальным вариантом будет перезагрузка аппаратного обеспечения и серверного оборудования.

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как сделать, чтобы ошибка конфликта блокировок при выполнении транзакции больше не появлялась в 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 есть две метрики мониторинга Lock Resolve OPS и KV Backoff OPS , которые можно использовать для проверки конфликтов чтения-записи в транзакциях. Если значения обоих not_expired и разрешают ниже Lock Resolve OPS увеличиваются, может быть много конфликтов чтения-записи. Элемент not_expired означает, что время блокировки транзакции не истекло. Элемент разрешить означает, что другая транзакция пытается очистить блокировки. Если значение другого элемента txnLockFast под KV Backoff OPS увеличивается, также могут возникнуть конфликты чтения-записи.

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

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

       [INFO] [coprocessor.go:743] ["[TIME_COP_PROCESS] resp_time: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: 74800000000004D35F6980000000000000010380000000004C788E0380000000004C0748 LOCK_VERSION: 41140293858205712.
     

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

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

Решения:

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

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

     ./tidb-ctl decoder -f table_row -k "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 pd tso [start_ts]
    tiup ctl pd tso [commit_ts]
     
  • Рекомендуется проверить, не является ли производительность записи низкой, что может привести к снижению эффективности фиксации транзакции и, таким образом, снятию блокировки.

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

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

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

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

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

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

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

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

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

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

Решения:

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

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

В режиме пессимистичных транзакций транзакции ожидают блокировки друг друга. Время ожидания блокировки определяется параметром 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 , чтобы получить информация о тупиковой цепочке ожидания. Для получения дополнительной информации см. раздел Ошибки взаимоблокировки и ТУПИКИ табличный документ.
  • Если взаимоблокировка возникает часто, вам необходимо настроить логику запроса транзакций в вашем приложении, чтобы уменьшить количество таких случаев.

Статистика блокировки: диагностика проблем с производительностью в Cloud Spanner | Ханс Хуанг | Google Cloud — Community

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

Всплески задержки записи 99-го процентиля

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

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

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

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

  • Таблица сводной статистики блокировок . Агрегированная таблица содержит общее время ожидания блокировки для каждого 1-минутного, 10-минутного и 60-минутного периодов. Общее время ожидания блокировки можно использовать для мониторинга общего состояния приложения и корреляции с пиковыми задержками.
  • Таблица статистики верхнего замка . Верхняя таблица статистики также содержит выбранные ячейки, для которых время ожидания блокировки самое продолжительное за каждые 1 минуту, 10 минут и 60 минут. Верхняя таблица статистики помогает зафиксировать определенные ячейки данных, которые подвергаются самому длительному ожиданию блокировки, и определить транзакции, которые претендуют на блокировки.

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

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

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

Итак, как Lock Statistics может помочь нам в нашем стремлении понять и, надеюсь, смягчить проблему, которая привела к проблемам с задержкой, которые мы обнаружили в нашем примерном сценарии? Как вы увидите, истинная сила коллекции инструментов самоанализа проявляется, когда мы объединяем информацию из этих инструментов за период времени, в течение которого наши проблемы начали возникать.

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

Статистика транзакций предоставляет информацию о задержке фиксации, а Статистика блокировок предоставляет информацию о времени ожидания блокировки. Если конфликты блокировок были причиной увеличения задержки фиксации, то вы должны увидеть корреляцию при объединении, например, (TXN_STATS_TOTAL_10MINUTE) со статистикой блокировок (LOCK_STAT_TOTAL_10MINUTE), как в следующем примере. Следующий пример запроса сообщает нам среднюю задержку фиксации и общее время ожидания блокировки для каждого 10-минутного интервала.

 SELECT  
t.interval_end,
t.avg_commit_latency_seconds,
l.total_lock_wait_seconds
FROM spanner_sys.txn_stats_total_10minute t
LEFT JOIN spanner_sys.lock_stats_total_10minute l
ON t.interval_end = l.interval_end
WHERE
t.interval_end >= “2020– 11–12T17:10:00Z»
И t.interval_end <= «2020–11–12T19:00:00Z»
ORDER BY interval_end;

Вот некоторые примеры результатов. Когда вы видите увеличение на avg_commit_latency_seconds сильно коррелирует с увеличением на total_lock_wait_seconds, , тогда вы знаете, что движетесь в правильном направлении.

Этот результат показывает, что avg_commit_latency_seconds увеличилось вместе с total_lock_wait_seconds за тот же период времени с 2020–11–12 18:10:00 до 2020–11–12 18:20:00 , а затем уменьшилось. Теперь, когда мы подтвердили, что время ожидания блокировки тесно связано с увеличением задержки записи, пришло время перейти к следующему вопросу.

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

 SELECT 
CAST(s.row_range_start_key AS STRING) AS row_range_start_key,
t.total_lock_wait_seconds,
s.lock_wait_seconds,
s.lock_wait_seconds/t.total_lock_wait_secondslock_of_total,
ROM0463 spanner_sys.lock_stats_top_10minute s,
spanner_sys.lock_stats_total_minute t
WHERE
t.interval_end = "2020-11-12T18:20:00Z"
AND s.interval_end = t.interval_end;

Из результата запроса видно, что конфликт произошел в таблице Singers по ключу SingerId=32 . Singers.SingerInfo — это столбец, в котором произошел конфликт блокировки, когда одна транзакция пыталась получить блокировку ReaderShared, а другая транзакция пыталась получить блокировку WriterShared.

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

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

Мы можем идентифицировать транзакции, извлекая fprint , read_columns , write_constructive_columns и avg_commit_latency_seconds из TXN_STATS_TOTAL_10MINUTE.

 SELECT 
fprint,
read_columns,
write_constructive_columns,
avg_commit_latency_seconds
FROM spanner_sys.txn_stats_top_10minute t2
WHERE (
EXISTS (
SELECT * FROM t2. read_columns columns
WHERE columns IN (
SELECT DISTINCT(req.COLUMN)
Из
SPENNER_SYS.LOCK_STATS_TOP_10MINUTE T,
T.SAMPLE_LOCK_REQUESTS REQ
, где
REQ.LOCK_MODE = "ReaderShared"
и T.Interval_END = "2020-11-12T18: 20: 00463) 9046) 9046) 9046). От T2.write_construction_columns столбцы
, где столбцы в (
SELECT DINST (req.column)
из
SPNER_SYS.LOCK_STATS_TOP_10MINUT 11-12Т18:20:00З")))
И t2.interval_end ="2020-11-12T18:20:00Z"
ЗАКАЗАТЬ ПО avg_commit_latency_seconds DESC;

Запрос идентифицирует следующие транзакции за исследуемый период времени:

  1. Транзакции, читающие из любого из столбцов, которые вызвали конфликт блокировок при попытке получить блокировку ReaderShared.
  2. Транзакции, выполняющие запись в любой из столбцов, вызвали конфликт блокировок при попытке получить блокировку WriterShared.
Пример результата запроса

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

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

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

Таким образом, Cloud Spanner теперь обеспечивает видимость конфликтов блокировок с введением статистики блокировок. Ознакомьтесь с документацией по статистике блокировки, чтобы получить более подробную информацию, и изучите другие инструменты самоанализа, которые помогут вам устранить неполадки и повысить производительность вашего экземпляра Cloud Spanner.

Статистика блокировки: диагностика проблем с производительностью в Cloud Spanner

Реальный сценарий

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

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

Cloud Spanner и блокировка

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

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

Что такое статистика блокировок

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

  • Сводная таблица статистики блокировок. Агрегированная таблица содержит общее время ожидания блокировки для каждого 1-минутного, 10-минутного и 60-минутного периодов. Общее время ожидания блокировки можно использовать для мониторинга общего состояния приложения и корреляции с пиковыми задержками.

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

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

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

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

Как использовать статистику блокировки

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

Являются ли конфликты блокировок основной причиной скачков задержки?

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

Статистика транзакций предоставляет информацию о задержке фиксации, а Статистика блокировок предоставляет информацию о времени ожидания блокировки. Если конфликты блокировок были причиной увеличения задержки фиксации, то вы должны увидеть корреляцию при объединении, например, (TXN_STATS_TOTAL_10MINUTE) со статистикой блокировок (LOCK_STAT_TOTAL_10MINUTE), как в следующем примере. Следующий пример запроса сообщает нам среднюю задержку фиксации и общее время ожидания блокировки для каждого 10-минутного интервала.

lang-sql

Загрузка...

ВЫБРАТЬ t.interval_end, t.avg_commit_latency_seconds, l.total_lock_wait_seconds ОТ spanner_sys.txn_stats_total_10minute t ЛЕВОЕ СОЕДИНЕНИЕ spanner_sys. lock_stats_total_10minute l ON t.interval_end = l.interval_end КУДА t.interval_end >= "2020-11-12T17:10:00Z" И t.interval_end <= "2020-11-12T19:00:00Z" ЗАКАЗАТЬ interval_end;

Вот некоторые примеры результатов. Когда вы видите, что увеличение avg_commit_latency_seconds сильно коррелирует с увеличением total_lock_wait_seconds, значит, вы движетесь в правильном направлении.

Этот результат показывает, что avg_commit_latency_seconds увеличилось вместе с total_lock_wait_seconds за тот же период времени с 2020-11-12 18:10:00 до 2020-11-12  18:20:00, а затем уменьшилось. Теперь, когда мы подтвердили, что время ожидания блокировки тесно связано с увеличением задержки записи, пришло время перейти к следующему вопросу.


Какие строки и столбцы вызывают длительное ожидание блокировки в течение определенного периода времени?

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

lang-sql

Загрузка...

ВЫБРАТЬ CAST(s.row_range_start_key AS STRING) КАК row_range_start_key, t.total_lock_wait_seconds, s.lock_wait_seconds, s.lock_wait_seconds/t.total_lock_wait_seconds frac_of_total, s.sample_lock_requests ИЗ spanner_sys.lock_stats_top_10минут с, spanner_sys.lock_stats_total_10минут t КУДА t.interval_end = "2020-11-12T18:20:00Z" И s.interval_end = t.interval_end;

Из результата запроса видно, что конфликт произошел в таблице Singers с ключом SingerId=32. Singers.SingerInfo — это столбец, в котором произошел конфликт блокировки, когда одна транзакция пыталась получить блокировку ReaderShared, а другая транзакция пыталась получить блокировку WriterShared.

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


Какие транзакции обращаются к столбцам, вовлеченным в конфликт блокировок?

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

Мы можем идентифицировать транзакции, извлекая fprint, read_columns, write_constructive_columns и avg_commit_latency_seconds из TXN_STATS_TOTAL_10MINUTE.

lang-sql

Загрузка...

ВЫБОР фпринт, чтение_столбцов, write_constructive_columns, avg_commit_latency_seconds ОТ spanner_sys.txn_stats_top_10minute t2 КУДА ( СУЩЕСТВУЮТ ( SELECT * FROM t2.read_columns columns ГДЕ столбцы IN ( ВЫБЕРИТЕ ОТЛИЧНЫЙ (треб. СТОЛБЦ) ОТ spanner_sys.lock_stats_top_10минут t, t.SAMPLE_LOCK_REQUESTS требование ГДЕ req.LOCK_MODE = "ReaderShared" И t.interval_end ="2020-11-12T18:20:00Z")) ИЛИ ЖЕ СУЩЕСТВУЮТ ( ВЫБЕРИТЕ * ИЗ t2.write_constructive_columns столбцы ГДЕ столбцы В ( ВЫБЕРИТЕ ОТЛИЧНЫЙ (треб. СТОЛБЦ) ОТ spanner_sys.lock_stats_top_10минут t, t.SAMPLE_LOCK_REQUESTS требование ГДЕ req.LOCK_MODE = "WriterShared" И t.interval_end ="2020-11-12T18:20:00Z")) ) И t2.interval_end ="2020-11-12T18:20:00Z" ORDER BY avg_commit_latency_seconds DESC;

Запрос идентифицирует следующие транзакции за исследуемый нами период времени: 


  1. Транзакции чтения из любого из столбцов, которые вызвали конфликт блокировок при попытке получить блокировку ReaderShared.

  2. Транзакции, выполняющие запись в любой из столбцов, вызвали конфликт блокировок при попытке получить блокировку WriterShared.


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


Оптимизация задержки транзакций с помощью рекомендаций 

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

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

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

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