
我了解如何单独使用松鼠和事务,但我不了解如何一起使用它们。我什么时候应该回滚或提交? 我的尝试正确与否?如果不是,我错在哪里......
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 语句,这将确保在函数退出之前正确处理并完成事务。
立即学习“go语言免费学习笔记(深入)”;
1、对ASP内核代码进行DLL封装,从而大大提高了用户的访问速度和安全性;2、采用后台生成HTML网页的格式,使程序访问速度得到进一步的提升;3、用户可发展下级会员并在下级购买商品时获得差额利润;4、全新模板选择功能;5、后台增加磁盘绑定功能;6、后台增加库存查询功能;7、后台增加财务统计功能;8、后台面值类型批量设定;9、后台财务曲线报表显示;10、完善订单功能;11、对所有传输的字符串进行安全
这是更新后的代码..
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
希望这有帮助。
另请参阅









