GoDasturchi
Transactions

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.

example.go
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

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.

example.go
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