sql - golang中的sql事务中的批量更新

标签 sql transactions go bulkinsert upsert

我一直在搞乱 golang 的带有事务的 sql 包,我试图了解如何在没有“每插入”往返通信的情况下进行批量更新插入。 examples here并没有真正展示如何完成任何批量查询。

updateMoney, err := db.Prepare("INSERT INTO balance set money=?, id=? ON DUPLICATE UPDATE balance SET money=money+? WHERE id=?")
...
tx, err := db.Begin()
...
res, err := tx.Stmt(updateMoney).Exec(123.45, 1, 123.45, 1)
res, err := tx.Stmt(updateMoney).Exec(67.89, 2, 67.89, 2)
res, err := tx.Stmt(updateMoney).Exec(10.23, 3, 10.23, 3)
...
tx.Commit()

理想情况下,我可以获取一个准备好的查询,并建立一个要同时发送的 upsert 列表......但是在这里,我们在每次执行后从数据库中返回一个结果。有什么建议可以解决这个问题吗?

编辑: 我的同事找到了 this open ticket这描述了问题......它看起来比严格在事务的上下文中更令人担忧。

最佳答案

这取决于您使用的驱动程序,某些驱动程序/数据库根本不支持事务。

例如 go-sql-driver/mysql支持交易就好了。

您的代码应该可以工作,或者您可以稍微修改一下:

tx, err := db.Begin()
...
stmt, err := tx.Prepare(`INSERT INTO balance set money=?, id=? ON DUPLICATE UPDATE balance SET money=money+? WHERE id=?`)
res, err := stmt.Exec(123.45, 1, 123.45, 1)
res, err := stmt.Exec(67.89, 2, 67.89, 2)
res, err := stmt.Exec(10.23, 3, 10.23, 3)
...
tx.Commit()

也可以查看 answer其中涉及到很多关于交易的细节。

关于sql - golang中的sql事务中的批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289593/

相关文章:

mysql - sql SELECT查询不做相反的事情

python - Django select_for_update 可以用来获取读锁吗?

java - 尽可能以交易方式发送邮件

sql-server - SQL Server 事务,未提交的数据保存在哪里?

c# - 强制转换规范的字符值无效

sql - 如何防止查询超时?

postgresql - 使用 psql 数组将 pq 迁移到 pgx 的问题

去监听已经在使用的端口不返回错误

sql - 将列从 varchar 更改为整数并删除非数字字符

python - 重写 MS 堆栈 : jQuery/C#/SQL Server