Transactions
Tranzaksiyalar
"Learn database/sql" kursida ko'rgan Begin/Commit/Rollback naqshi GORM'da ham bor, lekin qulayroq shaklda: db.Transaction(...) xatoni o'zi avtomatik boshqaradi.
err := db.Transaction(func(tx *gorm.DB) error {
// tx — shu tranzaksiya ichida ishlaydigan maxsus *gorm.DB
if err := tx.Create(&Order{Item: "Noutbuk", UserID: 1}).Error; err != nil {
return err // xato qaytarilsa — GORM AVTOMATIK Rollback qiladi
}
if err := tx.Model(&Wallet{}).Where("user_id = ?", 1).
Update("balance", gorm.Expr("balance - ?", 500000)).Error; err != nil {
return err
}
return nil // nil qaytarilsa — GORM AVTOMATIK Commit qiladi
})
if err != nil {
fmt.Println("tranzaksiya bekor qilindi:", err)
}db.Transaction(funksiya) — funksiya ichida nil qaytarilsa avtomatik Commit, xato qaytarilsa avtomatik Rollback qiladi — database/sqldagi kabi buni qo'lda yozish shart emas. Funksiya ichida albatta tx (berilgan parametr) ishlatilishi kerak, dbning o'zi emas — aks holda amallar tranzaksiya tashqarisida bajarilib ketadi. gorm.Expr("balance - ?", 500000) — ustunni joriy qiymatiga nisbatan yangilash uchun (masalan balansdan ayirish), oddiy qiymat bilan almashtirish emas.
Key Takeaway
Key Takeaway:
db.Transaction(func(tx *gorm.DB) error {...}) — xato bo'lsa avtomatik Rollback, muvaffaqiyatda avtomatik Commit qiladi; funksiya ichida albatta txdan foydalaning.
NEXT UP
Aggregations and Grouping