postgresql – 使用golang预处理语句的原始sql事务

postgresql – 使用golang预处理语句的原始sql事务,第1张

概述我找不到一些可以执行以下三项 *** 作的示例: 1)在golang中允许原始sql事务. 2)使用准备好的陈述. 3)回滚查询失败. 我想做这样的事情,但准备好的陈述. stmt, stmt_err := db.Prepare(` BEGIN TRANSACTION; -- Insert record into first table. 我找不到一些可以执行以下三项 *** 作的示例:

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.

是Go有一个很好的sql transactions实现.我们用 db.Begin开始交易,如果一切顺利,我们可以用 tx.Commit结束,如果出错,我们可以用 tx.Rollback结束.

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事务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1164832.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存