Dalam Go, anda boleh menggunakan jenis Tx untuk operasi transaksi. Untuk memulakan transaksi, gunakan db.Begin(). Dalam blok transaksi, operasi pangkalan data seperti pertanyaan dan kemas kini dilakukan. Selepas pelaksanaan berjaya, gunakan tx.Commit() untuk melakukan transaksi. Dalam amalan, urus niaga memastikan konsistensi untuk operasi serentak, seperti mengemas kini inventori dan membuat pesanan secara serentak.
Dalam Go, transaksi ialah himpunan operasi atom yang sama ada semuanya berjaya atau semuanya gagal. Ia digunakan untuk memastikan integriti operasi pangkalan data, terutamanya dalam situasi di mana berbilang operasi serentak boleh menyebabkan kerosakan data.
Transaksi dalam Go diwakili oleh jenis Tx
dalam pangkalan data/sql
. Untuk memulakan transaksi, lakukan perkara berikut: database/sql
中的 Tx
类型表示。要开始一个事务,请执行以下操作:
tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %w", err) }
在事务块中,您可以执行任何数据库操作。例如,以下代码从表中选择一条记录并将其更新为新值:
var id, version int if err := tx.QueryRow("SELECT id, version FROM example WHERE name = ?", "foo").Scan(&id, &version); err != nil { return fmt.Errorf("failed to select: %w", err) } result, err := tx.Exec("UPDATE example SET version = ? WHERE id = ? AND version = ?", version+1, id, version) if err != nil { return fmt.Errorf("failed to update: %w", err) }
在所有操作成功执行后,您可以使用 tx.Commit()
提交事务:
if err := tx.Commit(); err != nil { // 放弃事务 if err := tx.Rollback(); err != nil { return fmt.Errorf("failed to rollback transaction: %w", err) } return fmt.Errorf("failed to commit transaction: %w", err) }
考虑一个网上商店的数据库,该数据库包括一个 products
表和一个 orders
func CreateOrder(db *sql.DB, productID int, quantity int) error { tx, err := db.Begin() if err != nil { return fmt.Errorf("failed to begin transaction: %w", err) } var stock int if err := tx.QueryRow("SELECT stock FROM products WHERE id = ?", productID).Scan(&stock); err != nil { return fmt.Errorf("failed to select: %w", err) } if stock < quantity { return tx.Rollback() // 放弃事务,因为没有足够的库存 } if _, err := tx.Exec("UPDATE products SET stock = ? WHERE id = ?", stock-quantity, productID); err != nil { return fmt.Errorf("failed to update: %w", err) } if _, err := tx.Exec("INSERT INTO orders (product_id, quantity) VALUES (?, ?)", productID, quantity); err != nil { return fmt.Errorf("failed to insert: %w", err) } if err := tx.Commit(); err != nil { return fmt.Errorf("failed to commit transaction: %w", err) } return nil }
tx.Commit()
untuk melakukan transaksi : Semak sama ada produk mempunyai stok yang mencukupi.
🎜Jika ada stok, stok produk dipotong dan pesanan dibuat. 🎜🎜rrreee🎜Dengan menggunakan transaksi, kami memastikan inventori kedai sentiasa tepat, walaupun terdapat beberapa pesanan serentak cuba menolak inventori daripada produk yang sama. 🎜Atas ialah kandungan terperinci Bagaimana untuk menggunakan transaksi di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!