Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan transaksi di Golang?

Bagaimana untuk menggunakan transaksi di Golang?

WBOY
WBOYasal
2024-06-04 12:13:56792semak imbas

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.

如何在 Golang 中使用事务?

Bagaimana untuk menggunakan transaksi dalam Go?

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
}

Dalam blok transaksi, anda boleh melakukan sebarang operasi pangkalan data. Contohnya, kod berikut memilih rekod daripada jadual dan mengemas kininya dengan nilai baharu:
    rrreee
  1. Selepas semua operasi berjaya dilaksanakan, anda boleh menggunakan tx.Commit() untuk melakukan transaksi :
  2. rrreee

    Kes praktikal

  3. Pertimbangkan pangkalan data kedai dalam talian, yang termasuk jadual produk dan jadual pesanan. Kami ingin membuat transaksi untuk melakukan perkara berikut:

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn