
1)在golang中允许原始sql事务.
2)使用准备好的陈述.
3)回滚查询失败.
我想做这样的事情,但准备好的陈述.
stmt,stmt_err := db.Prepare(` BEGIN TRANSACTION; -- Insert record into first table. INSERT INTO table_1 ( thing_1,whatever) VALUES(,); -- Inert record into second table. INSERT INTO table_2 ( thing_2,whatever) VALUES(,); END TRANSACTION; `) if stmt_err != nil { return stmt_err } res,res_err := stmt.Exec( thing_1,whatever,thing_2,whatever) 当我运行它时,我收到此错误:
pq:无法将多个命令插入到预准备语句中
是什么赋予了?是否可以在golang中进行符合ACID的交易?我找不到一个例子.
编辑
没有例子here.
type Tx struct { }
Tx is an in-progress database transaction.
A transaction must end with a call to Commit or Rollback.
After a call to Commit or Rollback,all operations on the transaction fail with ErrTxDone.
The statements prepared for a transaction by calling the transaction’s Prepare or Stmt methods are closed by the call to Commit or Rollback.
另请注意,我们使用事务变量tx.Prepare(…)准备查询
您的功能可能如下所示:
func doubleInsert(db *sql.DB) error { tx,err := db.Begin() if err != nil { return err } { stmt,err := tx.Prepare(`INSERT INTO table_1 (thing_1,whatever) VALUES(,);`) if err != nil { tx.Rollback() return err } defer stmt.Close() if _,err := stmt.Exec(thing_1,whatever); err != nil { tx.Rollback() // return an error too,we may want to wrap them return err } } { stmt,err := tx.Prepare(`INSERT INTO table_2 (thing_2,err := stmt.Exec(thing_2,we may want to wrap them return err } } return tx.Commit()} 我有一个完整的例子here
总结以上是内存溢出为你收集整理的postgresql – 使用golang预处理语句的原始sql事务全部内容,希望文章能够帮你解决postgresql – 使用golang预处理语句的原始sql事务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)