事务开启

  • 1) Db上开启事务
func startTxByDb(db * sql.DB){
                    var err       error
                    var result    sql.Result
                    var tx      * sql.Tx
                    var val1      int      = 10
                    var val2      string   = "hello"
                    var insertSQL string   = "insert into testcase1(col1, col2) values(:1, :2)"
                    //从连接池中开启一个事务
                    tx, err    = db.Begin()
                    getError(err)
                    result, err = tx.Exec(insertSQL, val1, val2)
                    if err != nil{
                            //事务回退
                            if rollbackErr := tx.Rollback(); rollbackErr != nil {
                                    log.Fatalf("unable to rollback: %b", rollbackErr)
                            }
                            log.Fatalln(err)
                            return
                    }
                    rowsAffected, err := result.RowsAffected()
                    getError(err)
                    fmt.Println(rowsAffected)
                    //事务提交
                    if err = tx.Commit(); err != nil {
                            log.Fatalln(err)
                    }
            }
  • 2) Conn上开启事务
func startTxByConn(db *sql.DB){
        var err          error
        var result       sql.Result
        var conn       * sql.Conn
        var tx         * sql.Tx
        var val1         int    = 10
        var val2         string = "hello1!"
        var insertSQL    string = "insert into testcase1(col1, col2) values(:1, :2)"
        var rowsAffected int64
        ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second)
        defer cancel()
        //从连接池中返回一个连接
        conn, err    = db.Conn(ctx)
        getError(err)
        //将连接返回到连接池中
        defer conn.Close()
        //开启事务
        tx, err     = conn.BeginTx(ctx, nil)
        getError(err)
        result, err = tx.Exec(insertSQL, val1, val2)
        if err != nil{
                //事务回退
                if rollbackErr := tx.Rollback(); rollbackErr != nil {
                        log.Fatalf("unable to rollback: %b", rollbackErr)
                }
                log.Fatalln(err)
                return
        }
        rowsAffected, err = result.RowsAffected()
        getError(err)
        fmt.Println(rowsAffected)
        //事务提交
        if err = tx.Commit(); err != nil {
                log.Fatalln(err)
        }
}