Конец архитектурной эпохи


Классы запросов


Все классы транзакций, кроме new_order, уже являются двухфазными, поскольку для них никогда не требуется аварийное завершение. Для транзакций класса new_order может потребоваться аварийное завершение, поскольку во входных данных могут быть указаны неверные номера товаров. Однако в спецификации TPC-C допускается выполнение в начале таких транзакций запросов для каждого номера товара для проверки правильности этих номеров. За счет такой трансформации логики этой транзакции все классы транзакций становятся двухфазными. На самом деле, все они являются строго двухфазными, поскольку таблица Item никогда не модифицируется, и, следовательно, по поводу всех транзакций new_order, отправляемых ко всем репликам, принимается одно и то же решение о продолжении или аварийном завершении.

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

Во-первых, транзакция new_order вставляет кортежи в таблицы Order table и New_Order, а также заносит данные о позициях заказа в таблицу Order-line. В каждом узле эти операции будут являться частью некоторого единственного подплана, и перекрывающихся операций не будет. Это гарантирует, что транзакция order_status не сможет увидеть данные еще не полностью обработанного заказа. Во-вторых, поскольку транзакции new_order и payment в TPC-C являются строго двухфазными, между узлами не требуется какая-либо дополнительная координация даже при обновлении данных удаленного склада.

В третьих, транзакцию stock_level разрешается выполнять как несколько транзакций, которые могут наблюдать уровни запасов разных товаров в разные моменты времени, лишь бы соответствующие данные происходили от зафиксированных транзакций. Но, поскольку, транзакции new_orders при необходимости аварийно завершаются до выполнения каких-либо модификаций, любая информация о запасах будет происходить только от зафиксированных транзакций (или транзакций, которые скоро будут зафиксированы).


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

После применения основной стратегии все классы транзакций, кроме new_order и payment являются одноузловыми и, следовательно, классами с одноразовым использованием результатов. Класс транзакций payment уже является классом с одноразовым использованием результатов, поскольку при обновлении кортежей удаленного склада отсутствует потребность в обменах данными. Однако транзакциям класса new_order требуется вносить в таблицу Order-line информацию о районе, в котором имеется в наличии товар, и эта информация может находиться в другом узле. Поскольку это поле никогда не изменяется, и в таблице Stock отсутствуют удаления и вставки, можно вертикально разделить эту таблицу и реплицировать ее только читаемые части во всех узлах. После применения этой схемы репликации совместно с основной стратегией класс транзакций new_order становится классом с одноразовым использованием результатов.

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

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

Трудно представить, чтобы какая-либо автоматическая программа смогла понять, что требуется для того, чтобы сделать классы транзакций TPC-C стерильными или классами с одноразовым использованием результатов. Эти классы транзакций пришлось бы кодировать знающему человеку. Однако авторам кажется, что большинство классов транзакций анализировать будет проще. Таким образом, успешность автоматического анализа классов транзакций является открытым вопросом.


Содержание раздела