Как далеко можно действительно пойти с “возможной” непротиворечивостью и никакими транзакциями (иначе SimpleDB)?

const -квалификаторы для членов позволяют компилятору предполагать, что - после инициализации объекта - эти члены не должны быть изменены каким-либо образом, и он может оптимизировать код соответствующим образом (см., Например, комментарий @Ajay Brahmakshatriya ).

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

Я думаю, что есть главное различие между вашим примером и тем, что вы приняли в принятом ответе. В этом SO-ответе, целевой агрегатный объект с константными типами элементов создается через malloc:

ImmutablePoint init = { .x = x, .y = y };
ImmutablePoint *p = malloc(sizeof *p);
memcpy(p, &init, sizeof *p);

Согласно правилам того, как хранимое значение объекта может доступ (см. эту часть онлайн-проекта стандарта c ), целевой объект p впервые получит свой эффективный тип в ходе выполнения memcpy; эффективный тип - это тип исходного объекта init, а первый memcpy объекта, получившего malloced, можно рассматривать как инициализацию. Однако впоследствии изменение константных членов целевого объекта будет UB (я думаю, что даже секунда memcpy будет UB, но это, вероятно, основано на мнении).

6.5 Выражения

  1. Эффективным типом объекта для доступа к его сохраненному значению является объявленный тип объекта, если таковой имеется. 87) ... Если значение копируется в объект, не имеющий объявленного типа, используя memcpy или memmove, или копируется как массив символьного типа, , тогда эффективный тип модифицированного объекта для этот доступ и для последующих обращений, которые не изменяют значение, является эффективным типом объекта, из которого копируется значение , если оно имеется. Для всех других обращений к объекту, у которого нет объявленного типа, эффективным типом объекта является просто тип lvalue, используемого для доступа.

87) Выделенные объекты не имеют объявленного типа.

blockquote>

Однако в вашем примере целевой объект dst уже имеет объявленный тип в своем определении struct vector dst;. Следовательно, const-квалификаторы на элементах dst уже существуют до применения memcpy, и его следует рассматривать как назначение, а не инициализацию.

Так что я бы проголосовал за UB в этом случае.

6
задан capotej 29 November 2008 в 04:36
поделиться

2 ответа

Это - довольно классическое сражение между непротиворечивостью и масштабируемостью и - в некоторой степени - доступность. Некоторые данные должны не всегда быть настолько последовательными. Например, взгляд на digg.com и количество diggs против истории. Существует хороший шанс, что значение дублировано в записи "digg" вместо того, чтобы вынудить DB сделать соединение против "user_digg" таблицы. Имеет значение, если то число не совершенно точно?Наверное, нет. Затем использование чего-то как SimpleDB могло бы быть подходящим вариантом. Однако, если Вы пишете банковскую систему, необходимо, вероятно, оценить непротиворечивость прежде всего остального.:)

Если Вы не знаете со дня 1, что необходимо иметь дело с крупным масштабом, я придерживался бы простых более стандартных систем как RDBMS. Если Вы будете работать где-нибудь с разумной бизнес-моделью, то Вы будете, надо надеяться, видеть большой скачок в доходе, если будет большой скачок в трафике. Затем можно использовать те деньги для помощи решению масштабирующихся проблем. Масштабирование трудно, и масштабирование трудно предсказать. Большинством масштабирующихся проблем, которые причиняют Вам боль, будут, которые Вы никогда не ожидаете.

Я очень успешно начал бы сайт и провел бы несколько недель, устраняя проблемы масштаба, когда трафик берет, затем проводят так много времени, вызывая беспокойство о масштабе, что мы никогда не добираемся до производства, потому что мы остаемся без денег.:)

4
ответ дан 17 December 2019 в 07:10
поделиться

Принятие Вас говорит об этом SimpleDB, Вы не worrywart; существуют настоящие причины для не использования его в качестве реального мира DBMS.

Свойства, которые Вы получаете от поддержки транзакции в DBMS, могут быть сокращены акронимом "A.C.I.D".: Атомарность, Непротиворечивость, Изоляция и Длительность. A и D главным образом имеют отношение к системным катастрофическим отказам и C, и я имею отношение к регулярной операции. Они - все вещи, которые люди полностью считают само собой разумеющимся при работе с коммерческими базами данных, поэтому если Вы работаете с базой данных, которая не имеет одного или нескольких из них, Вы могли бы быть в для любого количества противных неожиданностей.

Атомарность: Любая транзакция или завершится полностью или нисколько (т.е. она будет или фиксировать или прерываться чисто). Это относится к отдельным операторам (как, "обновляют таблицу..."), а также дольше, более сложные транзакции. Если у Вас нет этого, то что-либо, что идет не так, как надо (как, диск, становящийся полным, компьютерным катастрофическим отказом, и т.д.), могло бы оставить что-то полусделанным. Другими словами, Вы никогда не можете полагаться на DBMS, чтобы действительно сделать вещи, которым Вы говорите его, потому что любое количество реальных проблем может помешать, и даже простой оператор UPDATE мог бы стать частично завершенным.

Непротиворечивость: Любые правила, которые Вы настроили о базе данных, будут всегда осуществляться. Как, если у Вас есть правило, в котором говорится всегда, равняется B, затем ничто, что кто-либо делает к системе баз данных, может нарушить то правило - это приведет к сбою любую операцию, которая пробует. Это не вполне как важное, если весь Ваш код прекрасен..., но действительно, когда что когда-либо имеет место? Плюс при пропавших без вести этой системы поддержки вещи добираются действительно yucky, когда Вы проигрываете...

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

Длительность: Если Вы теряете питание или катастрофические отказы программного обеспечения, что происходит с транзакциями базы данных, которые происходили? Если у Вас есть длительность, ответ - "ничто - они - весь сейф". Базы данных делают это при помощи чего-то позвонившего "Отмена / Вход Восстановления", где каждая небольшая вещь, которую Вы делаете к базе данных, сначала зарегистрирована (обычно на отдельном диске для безопасности) в некотором роде таким образом, что можно восстановить текущее состояние после отказа. Без этого другие свойства выше являются видом бесполезных, потому что Вы никогда не можете быть на 100% уверены, что вещи останутся последовательными после катастрофического отказа.

Какая-либо из этих вещей имеет значение для Вас? Ответ имеет все, чтобы сделать с типами транзакций, которые Вы делаете, и что гарантирует, что Вы хотите в ситуации с отказом. Могут быть случаи (как база данных только для чтения), где Вам не нужны они, но как только Вы начинаете делать что-либо нетривиальное, и что-то плохо происходит, Вам жаль, что у Вас не было их. Возможно, для Вас нормально просто возвращаться к резервному копированию каждый раз, когда что-то неожиданное происходит, но мое предположение - то, что это не.

Также обратите внимание, что отбрасывание всех этих мер защиты не делает его, учитывая, что Ваша база данных будет работать лучше; на самом деле это - вероятно, противоположное. Поэтому реальное программное обеспечение DBMS также имеет тонны кода для оптимизации производительности запросов. Так, если Вы пишете запрос, который присоединяется к 6 таблицам на SimpleDB, не предполагайте, что он выяснит оптимальный способ выполнить тот запрос - Вы могли бы закончить тем, что ожидали часы его для завершения, когда коммерческий DBMS мог использовать индексируемое хэширование и получить его через.5 секунд. Существует огромное количество небольших приемов, которые можно сделать, чтобы оптимизировать производительность запросов и верить мне, Вы действительно пропустите их, когда их не стало.

Ни одно из этого не предназначено как удар по SimpleDB; возьмите его от автора программного обеспечения: "Хотя это - большой обучающий инструмент, я не могу предположить, что любой хотел бы использовать его для чего-либо еще".

0
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: