我一直在搞乱 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/