問(wèn)題內(nèi)容
我了解如何單獨(dú)使用松鼠和事務(wù),但我不了解如何一起使用它們。我什么時(shí)候應(yīng)該回滾或提交?
我的嘗試正確與否?如果不是,我錯(cuò)在哪里……
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
}
登錄后復(fù)制
據(jù)我了解,我正在嘗試在 postgresql 中執(zhí)行查詢后回滾或提交
正確答案
你的努力是偉大的。但是 ....runwith(db.repo.getdatabase()) 在這種情況下是不正確的。因?yàn)槟鷳?yīng)該傳遞事務(wù)連接 tx 。指示 squirrel 使用事務(wù)對(duì)象作為查詢的數(shù)據(jù)庫(kù)連接。
如果您使用數(shù)據(jù)庫(kù)連接而不是事務(wù)連接,squirrel 查詢將不會(huì)成為事務(wù)的一部分。每個(gè)查詢將單獨(dú)執(zhí)行并立即提交到數(shù)據(jù)庫(kù)。
我們還可以使用 defer 語(yǔ)句更新 rollback 和 commit 語(yǔ)句,這將確保在函數(shù)退出之前正確處理并完成事務(wù)。
這是更新后的代碼..
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
登錄后復(fù)制
希望這有幫助。
另請(qǐng)參閱
database/sql tx – 檢測(cè)提交或回滾李>
使用 defer






