Инвалидация блокировок транзакций
YDB использует optimistic concurrency control для обнаружения конфликтов с другими выполняющимися транзакциями. Если проверка блокировок в стадии коммита обнаруживает конфликтующие изменения, транзакция откатывается и должна быть выполнена заново. В этом случае YDB возвращает ошибку transaction locks invalidated
. Повторное выполнение значительного количества транзакций может замедлить ваше приложение.
Примечание
YDB SDK предоставляет встроенный механизм обработки временных ошибок. Подробнее см. Обработка ошибок.
Диагностика
-
Откройте панель мониторинга DB overview в Grafana.
-
Проверьте, есть ли всплески количества ошибок на диаграмме Transaction Locks Invalidation.
Эта диаграмма отображает количество запросов в секунду, возвращаемых с ошибкой «transaction locks invalidation».
Рекомендации
Примите во внимание следующие рекомендации:
-
Чем дольше длится транзакция, тем выше вероятность возникновения ошибки
transaction locks invalidated
.По возможности избегайте интерактивных транзакций. Лучшим подходом является использование одного YQL-запроса с командами
BEGIN;
иCOMMIT;
для выбора данных, обновления данных и выполнения коммита транзакции.Если без интерактивных транзакций не обойтись, выполняйте коммит транзакции в последнем запросе.
-
Проанализируйте диапазон первичных ключей, в которых происходят конфликтующие изменения, и попытайтесь изменить логику приложения, чтобы уменьшить количество конфликтов.
Например, если одна строка с общим балансовым значением часто обновляется, разделите эту строку на сто строк и рассчитайте общий баланс как сумму этих строк. Это значительно сократит количество ошибок
transaction locks invalidated
.