Параллелизм БД - контрольная сумма против отметки времени - PullRequest
0 голосов
/ 07 декабря 2011

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

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 07 декабря 2011

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

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

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

...