Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 08.1 — Scripts de Versionamento Flyway (V1__criar_tabelas.sql)

Contexto: Scripts de Versionamento Flyway (V1__criar_tabelas.sql) no contexto de Migrações com Flyway e Gestão de Transações.

Requisitos de Execução:

  1. Organizar migrações na pasta src/main/resources/db/migration com padrão de nomenclatura estrito.

Resultado Esperado

Flyway executou V1 e V2 registrando checksums na tabela flyway_schema_history.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_1_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Migrações com Flyway e Gestão de Transações
🔑 Gabarito de Código & Solução Comentada
-- V1__criar_tabela_usuarios.sql
CREATE TABLE usuarios (
    id BIGSERIAL PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

🔍 Nível 2: Prática

Problema 08.2 — Demarcação Transacional com @Transactional e Propagation

Contexto: Demarcação Transacional com @Transactional e Propagation no contexto de Migrações com Flyway e Gestão de Transações.

Requisitos de Execução:

  1. Configurar @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class).

Resultado Esperado

Transação gerenciada pelo Spring: Commit ao finalizar método com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_2_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Migrações com Flyway e Gestão de Transações
🔑 Gabarito de Código & Solução Comentada
// TransacaoService.java
package com.empresa.api.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TransacaoService {
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void processar() {
        // Operações no banco
    }
}

⚡ Nível 3: Integração

Problema 08.3 — Propagação REQUIRES_NEW para Auditoria Isolada

Contexto: Propagação REQUIRES_NEW para Auditoria Isolada no contexto de Migrações com Flyway e Gestão de Transações.

Requisitos de Execução:

  1. Configurar método de auditoria com Propagation.REQUIRES_NEW garantindo que o log seja gravado mesmo se a transação principal sofrer rollback.

Resultado Esperado

Log de auditoria persistido em transação independente.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_3_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Migrações com Flyway e Gestão de Transações
🔑 Gabarito de Código & Solução Comentada
// AuditLogService.java
package com.empresa.api.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AuditLogService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void registrarLog(String evento) {
        System.out.println("LOG AUDITADO: " + evento);
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 08.4 — Níveis de Isolamento Transacional (Isolation.READ_COMMITTED)

Contexto: Níveis de Isolamento Transacional (Isolation.READ_COMMITTED) no contexto de Migrações com Flyway e Gestão de Transações.

Requisitos de Execução:

  1. Configurar nível de isolamento para evitar leituras sujas (dirty reads) e gerenciar locks de banco.

Resultado Esperado

Isolamento transacional configurado para conformidade com regras bancárias.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_4_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Migrações com Flyway e Gestão de Transações
🔑 Gabarito de Código & Solução Comentada
// IsolationConfig.java
package com.empresa.api.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ContaService {
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void debitar(Long id, Double valor) {}
}