Sobes.tech
Junior — Middle

Оё дар лоиҳаҳои худ фармони SELECT FOR UPDATE-ро барои бастани сатрҳо дар вақти транзаксияҳо истифода бурдаед?

sobes.tech AI

Ҷавоб аз AI

Бале, SELECT FOR UPDATE аксаран шартларини олдини олиш ва маълумотлар яхлитлигини таъминлаш учун транзакция давомида танланган қаторларни блоклаш учун кўпинча қўлланилади.

Goда, database/sql ёки ORM орқали маълумотлар базаси билан ишлаганда, бундай сўровни бажариш мумкин, бу қаторларни кейинги янгилаш учун блоклайди:

// Goда `SELECT FOR UPDATE`дан фойдаланиш намунаси
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()
}

Бу ерда, SELECT FOR UPDATE фойдаланувчи қаторини блоклайди, шунда бошқа транзакциялар уни ўзгартиришга улгурмайди, бу рақобат шароитларини олдини олишга ёрдам беради.