Pull to refresh

Comments 4

Про это отдельно надо написать, прям хорошая идея

Понятно, что ничего не понятно. Calvin и 2PC имеют выделенный узел - sequencer или координатор транзакций. В первом случае отправляется «спланированная транзакция», а во втором «транзакция». И делается вывод, что первое лучше второго, но в чем их разница не ясно от слова совсем.

Я строю догадки - видимо разница в том, что в Calvin нет параллельных транзакций и потому не нужны блокировки. Вместо выполнения N транзакций одновременно выполняется одна, а N+1 параллельно готовятся к выполнению, загружаются данные, вычисляются хеши и все в этом духе.

Ещё sequencer может не ждать пока транзакция завершится, а тупо строить «план» и пушить транзакции на узлы. Единственное условие - транзакции должны быть без рандома любого рода, DateTime.Now, random() и аналоги нужно вычислить ещё на sequencer.

А ещё sequencer мог бы быть достаточно умным, чтобы догадаться, что транзакции независимы и пушить их параллельно.

Все верно говорю или где-то напутал?

К сожалению, не читал работу Йельского университета, однако по поводу изложения имею определенные нарекания: расписана техническая реализация метода, тогда как концептуальные вопросы остались за кадром:

Если говорить очень упрощенно, основная идея Calvin состоит в том, что узлы договариваются о плане выполнения транзакции до того, как поставят блокировки и начнут выполнять транзакцию.

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

В случае с Calvin и детерминированными системами, недетерминированное событие не отменяет транзакцию целиком.

Ну и хрен-то с ним! Скажите лучше как отменить транзакцию в случае детерминированного события? В качестве примера операция покупки товара:

  • DB 1 (счета): прочитать регистр счета клиента, проверить, есть ли в наличии необходимая сумма, вычесть цену товара и записать в регистр счета

  • DB2 (товары): прочитать регистр количество товара на стоке, проверить, есть ли в наличии необходимое количество, вычесть количество купленных, записать обратно в регистр стока.

Как Calvin будет организовывать атомарность данных операций и откат DB1, когда на складе нет достаточного количества?

Sign up to leave a comment.

Articles