gpt4 book ai didi

postgresql - 带有 golang 准备语句的原始 sql 事务

转载 作者:IT老高 更新时间:2023-10-28 13:10:12 25 4
gpt4 key购买 nike

我很难找到一些执行以下三项操作的示例:

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, whatever)
VALUES($1, $2);`)
if err != nil {
tx.Rollback()
return err
}
defer stmt.Close()

if _, err := stmt.Exec(thing_2, whatever); err != nil {
tx.Rollback() // return an error too, we may want to wrap them
return err
}
}

return tx.Commit()
}

我有一个完整的例子 here

关于postgresql - 带有 golang 准备语句的原始 sql 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com