Нужны ли мне атомарные транзакции или достаточно согласованности?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Нужны ли мне атомарные транзакции или достаточно согласованности?

Сообщение Anonymous »

Сейчас я работаю над системой, очень похожей на традиционную банковскую систему. Он поддерживает следующие API:

Код: Выделить всё

class Bank {
public:
std::expected add(string account_id, int amount);

std::expected remove(string account_id, int amount);

std::expected transfer(
string source,
string destination,
int amount);
};
В этой системе учетные записи хранятся в разных сегментах системы. Я пытаюсь рассуждать о том, нужно ли мне поддерживать транзакции для перемещения сумм между двумя учетными записями в системе.
Другая цепочка мыслей, которая, по-видимому, преобладает на моем рабочем месте, заключается в создании в конечном итоге согласованной декларативной системы, которая для простоты пропускает эти вызовы API через различные сегменты системы. Например, это может принимать форму следующих шагов:

Код: Выделить всё

std::expected Bank::transfer(
string source,
string destination,
int amount,
string request_id) {
while (true) {
{
auto result = remove(source, amount, request_id);
if (!result.has_value()) {
return std::unexpected(BankError::TransferOutFailed);
}
}

{
auto result = add(destination, amount, request_id);
if (!result.has_value()) {
return std::unexpected{BankError::TransferInFailed);
}
}

return;
}
}
Здесь я добавил некоторую семантику, чтобы обеспечить конечную согласованность (или близкую к ней, для целей обсуждения): если request_id передается вышеуказанным функциям, функция не будет выполняться дважды. Включение идемпотентности. Это позволяет вышеизложенному в конечном итоге привести к завершению перевода.
Почему-то я не могу понять, почему транзакционный перевод суммы со счета A на B упростит систему, если будет обеспечен в конечном итоге согласованный механизм. Вот причины, о которых я могу думать:
  • Если есть много транзакций, которые не реализуются в другом сегменте, мы можем столкнуться со сценариями, в которых мы эффективно уменьшаем сумму в одном аккаунте, не отображая ее в другом. Уменьшение суммы между двумя учетными записями.
  • Нам необходим контроль параллелизма поверх учетных записей, чтобы гарантировать отсутствие одновременных транзакций чтения, в которых наблюдаются неправильные значения из-за незавершенных транзакций.
  • Если целевой аккаунт не существует, нам необходимо включить протоколы отката.
На практике Я предполагаю, что есть и другие причины для реализации здесь транзакционной семантики. Но я не могу думать о них. Буду признателен за ясность от людей, которые уже реализовали такую ​​семантику!

Подробнее здесь: https://stackoverflow.com/questions/798 ... ncy-enough
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»