Sobes.tech
Junior — Middle

¿Ha tenido que usar la instrucción SELECT FOR UPDATE en sus proyectos para bloquear filas durante las transacciones?

sobes.tech AI

Respuesta de la IA

Sí, la instrucción SELECT FOR UPDATE se usa a menudo para bloquear las filas seleccionadas en la base de datos durante una transacción, para evitar condiciones de carrera y garantizar la integridad de los datos.

En Go, al trabajar con bases de datos a través de database/sql o ORM, se puede ejecutar tal consulta para bloquear filas para su posterior actualización:

// Ejemplo de uso de SELECT FOR UPDATE en 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()
}

Aquí, SELECT FOR UPDATE bloquea la fila del usuario para que otras transacciones no puedan modificarla hasta que la transacción actual finalice. Esto previene problemas de acceso concurrente, como doble deducción de fondos.