加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:15:03 所属栏目:百科 来源:网络整理
导读:我找不到一些可以执行以下三项操作的示例: 1)在golang中允许原始sql事务. 2)使用准备好的陈述. 3)回滚查询失败. 我想做这样的事情,但准备好的陈述. stmt,stmt_err := db.Prepare(` BEGIN TRANSACTION; -- Insert record into first table. INSERT INTO tabl
我找不到一些可以执行以下三项操作的示例:

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($1,$2);

            -- Inert record into second table.

            INSERT INTO table_2 (
                    thing_2,whatever)
            VALUES($3,$4);

            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($1,$2);`)
        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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读