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.