在一个事务中在 golang 中执行多个查询的惯用方法

我目前正在努力(我的第二天)找到执行多个查询的最佳方法,并且想知道您是否知道解决方案。


我有一个打开的 *sql.DB 连接,名为myDb并使用go-sql-driver


func TruncateGalleryImport() error {


    s := make([]string, 0)


    s = append(s, "TRUNCATE TABLE add_map")

    s = append(s, "TRUNCATE TABLE album")

    s = append(s, "TRUNCATE TABLE album_permission")

    s = append(s, "TRUNCATE TABLE album_view")

    s = append(s, "TRUNCATE TABLE album_watch")

    s = append(s, "TRUNCATE TABLE media")

    s = append(s, "TRUNCATE TABLE media_user_view")

    s = append(s, "TRUNCATE TABLE media_view")

    s = append(s, "TRUNCATE TABLE media_watch")

    s = append(s, "TRUNCATE TABLE private_map")

    s = append(s, "TRUNCATE TABLE attachment")

    s = append(s, "TRUNCATE TABLE attachment_data")


    for _, q := range s {

        _, err := myDb.Exec(q)

        if err != nil {

            return err

        }

    }


    return nil

}

是否可以仅使用一个事务将上述所有查询一起提交?


隔江千里
浏览 281回答 2
2回答

郎朗坤

您可以使用包装函数来执行提交/回滚逻辑,甚至可能使用字符串匹配来扩展错误处理。// RDBTransaction is a function which abstracts a sql transaction// into a function with an isolation level (isolvl) parameter.// the following integers represent the available isolation levels (isolvl)//  1: SERIALIZABLE//  2: REPEATABLE READ//  3: READ COMMITTED//  4: READ UNCOMMITTEDfunc RDBTransaction(db *sql.DB, isolvl int, fn func(*sql.Tx) error) (err error) {    var tx *sql.Tx    tx, err = db.Begin()    if err != nil {        return err    }    // transaction isolation level setting    switch isolvl {    case 1:        _, err = tx.Exec(`set transaction isolation level serializable`)    case 2:        _, err = tx.Exec(`set transaction isolation level repeatable read`)    case 3:        _, err = tx.Exec(`set transaction isolation level read committed`)    case 4:        _, err = tx.Exec(`set transaction isolation level read uncommitted`)    default:        _, err = tx.Exec(`set transaction isolation level serializable`)    }    if err != nil {        return err    }    // catch all, commit/rollback    defer func() {        if err != nil {            tx.Rollback()            return        }        err = tx.Commit()    }()    // run transaction    err = fn(tx)    return err}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go