Вопрос

Я пишу простое приложение с 24 элементами в хэше, которое должно быть постоянным во время выполнения программы, поэтому Berkeley DB (DBM) должна хорошо подходить для этой задачи.

И это просто для развлечения.

Но мне интересно, если использовать его (с Ruby), то, когда пользователь нажимает CTRL-C, выполнение останавливается.В этом случае, не могут ли все данные быть перепутаны?

Например, если значение в базе данных равно 63, и я увеличиваю его на 1 (до 64),

63 =  111111 (in binary)  
64 = 1000000 (in binary)

итак, может ли CTRL-C появиться прямо тогда, когда записана "Самая значимая" 1, но 0 не были записаны?В этом случае значение в базе данных будет равно 127 вместо 63 или 64.Что, если это не Ruby, а на C, и пользователь использует "закрыть окно" или "убить", чтобы остановить процесс?Если подумать об этом, жесткий диск, вероятно, записывает этот байт (или 4 байта) на поверхность жесткого диска одновременно, так что этого не должно произойти.

если CTRL-C не приведет к этому, то это может произойти из-за отключения питания или из-за того, что я выдернул вилку из розетки?Например, когда значение сначала кэшируется в оперативной памяти, и пока оно записывается на жесткий диск, я выдергиваю вилку питания, и жесткий диск отключается до того, как будут записаны значения 0.Я знаю один случай из миллиона, что этого не произойдет, но это всего лишь вопрос любопытства.

С другой стороны, если мой сценарий состоит в том, чтобы

  1. Уменьшите номинал монеты
  2. Дайте пользователю "гамбургер" в его инвентаре

затем, когда пользователь нажимает CTRL-C, и это происходит прямо между (1) и (2) выше, тогда у пользователя будет меньше монет, и он не получит гамбургер.

Чтобы предотвратить все это, можно было бы использовать транзакционный метод с использованием SleepyCat, SQLite или MySQL, и ничего из этого не произойдет?

Это было полезно?

Решение

Ни одна хорошая система баз данных (категория, включающая Berkley DB) не может быть прервана предложенным вами способом с частичным обновлением значения.Когда вы нажимаете control-c, вы не можете прервать выполнение команды CPU в середине.Прерывание всегда имеет некоторый уровень детализации, и хорошо написанные базы данных используют этот факт для защиты от того, чтобы база данных когда-либо находилась в несогласованном состоянии.

Вероятность повреждения и потери данных существует при отключении питания, но детали того, будут ли данные потеряны или повреждены, в большей степени зависят от файловой системы, в которой хранятся файлы базы данных.Хорошая файловая система ведения журнала, например, записывает то, что она собирается сделать, в "журнал", затем выполняет это, затем записывает в журнал, что она это сделала.Поэтому, если он теряет питание, например, во время операции записи, он просматривает свой журнал, чтобы увидеть, есть ли что-нибудь, что ему нужно завершить, прежде чем разрешить доступ к файловой системе.Это чрезмерное упрощение, но вы можете получить подробную информацию, например, просмотрев ext3 в Википедии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top