DEV Community

Cover image for ACID Transactions em uma Aplicação Fintech:
Rafael Avelar Campos for 3X Pay

Posted on

1 1

ACID Transactions em uma Aplicação Fintech:

Introdução

Em aplicações de fintech, garantir a integridade das transações financeiras é essencial. Problemas como transações incompletas ou dados inconsistentes podem comprometer a confiança dos usuários e a segurança do sistema. Para mitigar esses riscos, podemos usar os conceitos de transações ACID, que garantem operações confiáveis e robustas.

Neste artigo, vou mostrar as propriedades ACID e uma implementação usando NestJS, Prisma e PostgreSQL, utilizando o seguinte modelo de transação:

model Transaction {
  id                Int      @id @default(autoincrement())
  userId            Int
  subTotal          Decimal  @default(0) @db.Decimal(10, 2)
  total             Decimal  @default(0) @db.Decimal(10, 2)
  transactionId     String?  @unique
  order_processor_id String
  payment_method    PaymentMethod
  status            TransactionStatus
  external_id       String
  e2e_id            String?
  error_message     String?
  created_at        DateTime? @default(now())
  updated_at        DateTime? @updatedAt
  customerId        Int?
  callback_url      String?
  typeTransaction   TypeTransaction
  future_balance    Decimal  @default(0) @db.Decimal(10, 2)
  previous_balance  Decimal  @default(0) @db.Decimal(10, 2)

  Customers         Customer? @relation(fields: [customerId], references: [id])
  user              User      @relation(fields: [userId], references: [id])
}
Enter fullscreen mode Exit fullscreen mode

Entendendo as Propriedades ACID

1. Atomicidade (Atomicity)

A atomicidade garante que uma transação seja tratada como uma unidade indivisível. Ou todas as operações dentro da transação são executadas com sucesso, ou nenhuma é aplicada. Isso é crucial em aplicações fintech para evitar cenários como debitar uma conta sem creditar o destinatário.

Exemplo:
Imagine transferir fundos entre duas contas:

await this.prisma.$transaction(async (prisma) => {
  await prisma.transaction.create({
    data: {
      userId: fromUserId,
      subTotal: amount,
      total: amount,
      status: 'PENDING',
    },
  });

  await prisma.transaction.create({
    data: {
      userId: toUserId,
      subTotal: amount,
      total: amount,
      status: 'COMPLETED',
    },
  });
});
Enter fullscreen mode Exit fullscreen mode

Se a criação de qualquer uma das transações falhar, o sistema garante que nenhuma alteração seja persistida.

2. Consistência (Consistency)

A consistência assegura que o banco de dados transite de um estado válido para outro, sempre preservando regras e restrições definidas.

Exemplo:
Ao criar uma nova transação, todos os campos obrigatórios, como userId, subTotal e status, devem ser válidos.

model Transaction {
  id         Int      @id @default(autoincrement())
  userId     Int
  subTotal   Decimal  @default(0) @db.Decimal(10, 2)
  total      Decimal  @default(0) @db.Decimal(10, 2)
  status     String
}
Enter fullscreen mode Exit fullscreen mode

Se qualquer campo obrigatório estiver ausente ou contiver dados inválidos, o banco de dados rejeita a transação, mantendo a consistência.

3. Isolamento (Isolation)

O isolamento garante que transações concorrentes não interfiram umas com as outras. Cada transação é executada como se fosse a única operando no sistema.

Exemplo:
Se dois usuários iniciam transações simultaneamente, a propriedade de isolamento garante que os cálculos de saldo permaneçam precisos.

await this.prisma.$transaction([operation1, operation2]);
Enter fullscreen mode Exit fullscreen mode

O PostgreSQL lida com diferentes níveis de isolamento (READ COMMITTED, SERIALIZABLE, etc.) para gerenciar operações concorrentes.

4. Durabilidade (Durability)

A durabilidade garante que, uma vez que uma transação é confirmada, ela permanece persistente, mesmo em caso de falha do sistema.

Exemplo:
Após registrar com sucesso uma transação financeira, os dados permanecem intactos e disponíveis, independentemente de falhas no servidor.

await this.prisma.transaction.create({
  data: {
    userId: userId,
    subTotal: amount,
    total: amount,
    status: 'PROCESSED',
  },
});
Enter fullscreen mode Exit fullscreen mode

Uma vez confirmada, o PostgreSQL garante que a transação persista no disco.

Conclusão

As transações ACID são essenciais para garantir a confiabilidade e integridade das operações financeiras em aplicações fintech. Compreender e implementar corretamente as propriedades de Atomicidade, Consistência, Isolamento e Durabilidade é fundamental para construir serviços financeiros seguros e escaláveis.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs