Rumah >pembangunan bahagian belakang >Golang >Pertanyaan postgresql Golang menggunakan transaksi dan tupai
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
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
语句更新 rollback
和 commit
, 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!