2011-12-06 2 views
0

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

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

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

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

спасибо.

+0

Контрольная сумма используется для определения допустимости данных, то есть номера кредитной карты или номера библиотеки. Если контрольная сумма действительна, то номер карты потенциально действителен. В этом случае использование контрольной суммы для определения того, изменилась ли запись, не является тем, для чего предназначена контрольная сумма. –

ответ

0

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

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

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

+0

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

+0

Да, обычно это просто номер. –

Смежные вопросы