dongya767979565 2018-09-15 13:47
浏览 274
已采纳

golang数据库事务:如果单个exec语句失败,则继续

I am writing a Go app which should insert thousands of values from a file into a database. This works fine, as long as all values can be inserted into the database. If one of the queries fails, all queries afterwards fail because of pq: : current transaction is aborted, commands ignored until end of transaction block

I want to insert all elements and if the insert of an element fails, it should be skipped and the other elements should be inserted.

My Code:

func (db *Database) Insert(values []Value) (transerr error) {
    tx, err := db.Begin()
    if transerr != nil {
        return nil, err
    }
    defer func() {
        if err != nil {
            tx.Rollback()
        } else {
            tx.Commit()
        }
    }
    stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)")
    if err != nil {
        return err
    }

    defer stmt.Close()

    for _, value : range values {
        _, err = stmt.Exec(value)
        if err != nil {
            log.Error(err)
        }
    }
    return nil
}

I tried to add a tx.Rollback() in case a stmt.Exec fails - however this results in sql: statement is closed.

  • 写回答

2条回答 默认 最新

  • douaoj0994 2018-09-20 22:14
    关注

    My solution for the problem looks like this:

    • Do not create a single transaction and add all statements into it, instead just run it without creating transactions.
    • As the values are read in, spawn new go routines and let the transaction run parallelized (be careful with connection limits).
    • Without parallelization, the performance dropped about 30% (from 20s for 25k values to 30s - we did not use parallelization before).
    • With parallelization, the performance increased about 4 times (to 5 seconds) - just be careful you stay within the connection ranges
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器