我已经用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()
理想情况下,我可以准备一个查询,并建立一个同时发送的提供的列表.但是在这里,每次执行后我们都会从数据库中获得一个结果.有什么建议如何去做这个?
编辑:
我的同事发现,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,err := stmt.Exec(67.89,err := stmt.Exec(10.23,3) ... tx.Commit()
还要查看这个answer,这有关于交易的很多细节.