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