Инвалидация блокировок транзакций

YDB использует optimistic concurrency control для обнаружения конфликтов с другими выполняющимися транзакциями. Если проверка блокировок в стадии коммита обнаруживает конфликтующие изменения, транзакция откатывается и должна быть выполнена заново. В этом случае YDB возвращает ошибку transaction locks invalidated. Повторное выполнение значительного количества транзакций может замедлить ваше приложение.

Примечание

YDB SDK предоставляет встроенный механизм обработки временных ошибок. Подробнее см. Обработка ошибок.

Диагностика

  1. Откройте панель мониторинга DB overview в Grafana.

  2. Проверьте, есть ли всплески количества ошибок на диаграмме Transaction Locks Invalidation.

    Эта диаграмма отображает количество запросов в секунду, возвращаемых с ошибкой «transaction locks invalidation».

Рекомендации

Примите во внимание следующие рекомендации:

  • Чем дольше длится транзакция, тем выше вероятность возникновения ошибки transaction locks invalidated.

    По возможности избегайте интерактивных транзакций. Лучшим подходом является использование одного YQL-запроса с командами BEGIN; и COMMIT; для выбора данных, обновления данных и выполнения коммита транзакции.

    Если без интерактивных транзакций не обойтись, выполняйте коммит транзакции в последнем запросе.

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

    Например, если одна строка с общим балансовым значением часто обновляется, разделите эту строку на сто строк и рассчитайте общий баланс как сумму этих строк. Это значительно сократит количество ошибок transaction locks invalidated.