Transactions
Tranzaksiyalar
Bir nechta amalni "hammasi yoki hech biri" tamoyili bilan bajarish kerak bo'lsa (masalan pul o'tkazish: bir hisobdan ayirish, boshqasiga qo'shish), tranzaksiya ishlatiladi.
tx, err := db.Begin()
if err != nil {
fmt.Println("xato:", err)
return
}
_, err = tx.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Kamola", int64(28))
if err != nil {
tx.Rollback() // biror qadam muvaffaqiyatsiz bo'lsa — HAMMASINI bekor qiling
fmt.Println("xato, bekor qilindi:", err)
return
}
if err := tx.Commit(); err != nil { // hammasi joyida bo'lsa — o'zgarishlarni tasdiqlang
fmt.Println("commit xatosi:", err)
return
}
fmt.Println("tranzaksiya muvaffaqiyatli")db.Begin() yangi tranzaksiya boshlaydi va *sql.Tx qaytaradi — u db bilan bir xil Exec/Query metodlariga ega. Agar yo'lda biror xato yuz bersa, tx.Rollback() chaqirilib, shu tranzaksiya ichidagi barcha o'zgarishlar bekor qilinadi — xuddi ular umuman bo'lmagandek. Hammasi muvaffaqiyatli bo'lsa, tx.Commit() o'zgarishlarni doimiy qiladi. Bu — ma'lumotlar bazasining eng muhim kafolatlaridan biri: qisman bajarilgan, chala amaliyot hech qachon saqlanib qolmaydi.
>_ Exercise
Tranzaksiya ichida ikkita amalni bajaring.
- •db.Begin() bilan tranzaksiya boshlang
- •tx.Exec bilan ikkita INSERT bajaring
- •tx.Commit() qiling va memTable uzunligini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
db.Begin()/tx.Commit()/tx.Rollback() — bir nechta amalni "hammasi yoki hech biri" tamoyili bilan bajarishning standart usuli.
NEXT UP
Connection Pool Configuration
$ go run main.go
Kodingizni ishga tushiring