Sobes.tech
Junior — Middle

Já teve que usar o comando SELECT FOR UPDATE nos seus projetos para bloquear linhas durante transações?

sobes.tech IA

Resposta da IA

Sim, a instrução SELECT FOR UPDATE é frequentemente usada para bloquear as linhas selecionadas na base de dados durante uma transação, para evitar condições de corrida e garantir a integridade dos dados.

Em Go, ao trabalhar com bases de dados através de database/sql ou ORM, pode executar tal consulta para bloquear linhas para atualização posterior:

// Exemplo de uso de SELECT FOR UPDATE em Go
func updateUserBalance(db *sql.DB, userID int, amount float64) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer tx.Rollback()

    var balance float64
    err = tx.QueryRow("SELECT balance FROM users WHERE id = ? FOR UPDATE", userID).Scan(&balance)
    if err != nil {
        return err
    }

    newBalance := balance + amount
    _, err = tx.Exec("UPDATE users SET balance = ? WHERE id = ?", newBalance, userID)
    if err != nil {
        return err
    }

    return tx.Commit()
}

Aqui, SELECT FOR UPDATE bloqueia a linha do utilizador para que outras transações não possam alterá-la até que a transação atual seja concluída. Isto previne problemas de acesso concorrente, como deduções duplas de fundos.