Параллелизм БД - контрольная сумма против отметки времени

Мы находимся в процессе перехода на новую систему баз данных. База данных имеет тип ISAM, и API не предоставляет способ обнаружить, была ли запись изменена другим пользователем.

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

Мой вопрос таков: поскольку существует вероятность того, что одно и то же значение контрольной суммы может быть рассчитано для двух разных записей, было бы лучше иметь вместо этого поле отметки времени?

Как обычно обрабатывается обнаружение изменения записи?

Спасибо.

1 ответ

Решение

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

Это называется "оптимистическая блокировка", когда ваша транзакция не блокирует ресурсы БД, пока не пришло время обновить БД. В этот момент он блокирует необходимые ресурсы БД (например, таблицы), читает версию из БД и проверяет, имеет ли она ожидаемое значение. Если да, это означает, что безопасно обновлять базу данных вместе с номером версии в БД. Если нет, это означает, что произошло одновременное обновление, и транзакция должна быть прервана.

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

Другие вопросы по тегам