Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pertanyaan postgresql Golang menggunakan transaksi dan tupai

Pertanyaan postgresql Golang menggunakan transaksi dan tupai

WBOY
WBOYke hadapan
2024-02-06 09:54:08986semak imbas

使用事务和 squirrel 进行 Golang postgresql 查询

Kandungan soalan

Saya faham cara menggunakan tupai dan transaksi secara berasingan, tetapi saya tidak faham cara menggunakannya bersama-sama. Bilakah saya perlu tarik balik atau komited? Adakah percubaan saya betul? Kalau tak, mana silap saya...

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(db.repo.GetDatabase())

for _, human:= range humans{
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()
if err != nil {
    if err := tx.Rollback(); err != nil {
        return nil, err
    }
}

if err := tx.Commit(); err != nil {
    return nil, err
}

Seperti yang saya fahami, saya cuba untuk mengundur atau melakukan selepas melaksanakan pertanyaan dalam postgresql


Jawapan betul


Usaha anda hebat. Tetapi ....runwith(db.repo.getdatabase()) 在这种情况下是不正确的。因为您应该传递事务连接 tx . Mengarahkan tupai untuk menggunakan objek transaksi sebagai sambungan pangkalan data untuk pertanyaan.

Jika anda menggunakan sambungan pangkalan data dan bukannya sambungan transaksi, pertanyaan tupai tidak akan menjadi sebahagian daripada transaksi. Setiap pertanyaan akan dilaksanakan secara individu dan diserahkan kepada pangkalan data serta-merta.

Kami juga boleh menggunakan penyata defer 语句更新 rollbackcommit, yang akan memastikan transaksi diproses dan diselesaikan dengan betul sebelum fungsi itu keluar.

Ini adalah kod yang dikemas kini..

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

// added defer rollback and commit
defer func() {
    if err != nil {
        fmt.Println("An error happened while executing the queries - ", err)
        tx.Rollback()
        return
    }
    err = tx.Commit()
}()

response := make([]storage.URLStorage, 0, len(urls))

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(tx)

for _, human := range humans {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

// the error will be handled by the defer
_, err = sb.Exec()

// you can execute multiple queries with the transaction
for _, human := range someOtheSlice {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()

// If any error happened this query executions, all will be roll backed with the defer

Semoga ini membantu.

Lihat juga

Atas ialah kandungan terperinci Pertanyaan postgresql Golang menggunakan transaksi dan tupai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam