为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
隔江千里 2021-09-10 16:36:54
我目前正在努力(我的第二天)找到执行多个查询的最佳方法,并且想知道您是否知道解决方案。我有一个打开的 *sql.DB 连接,名为myDb并使用go-sql-driverfunc 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}是否可以仅使用一个事务将上述所有查询一起提交?
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

您可以使用包装函数来执行提交/回滚逻辑,甚至可能使用字符串匹配来扩展错误处理。


// 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 UNCOMMITTED

func 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

}



查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信