成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang transaction 事務使用的正確姿勢

開發 后端
本文中作者展示了 golang 事務的三種寫法。

本文中作者展示了 golang 事務的三種寫法

第一種寫法

這種寫法非常樸實,程序流程也非常明確,但是事務處理與程序流程嵌入太深,容易遺漏,造成嚴重的問題

func DoSomething() (err error) {
    tx, err := db.Begin()
    if err != nil {
        return
    }


    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)  // re-throw panic after Rollback
        }
    }()


    if _, err = tx.Exec(...); err != nil {
        tx.Rollback()
        return
    }
    if _, err = tx.Exec(...); err != nil {
        tx.Rollback()
        return
    }
    // ...


    err = tx.Commit()
    return
}

第二種寫法

下面這種寫法把事務處理從程序流程抽離了出來,不容易遺漏,但是作用域是整個函數,程序流程不是很清晰

func DoSomething() (err error) {
    txerr := db.Begin()
    if err != nil {
        return
    }


    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p// re-throw panic after Rollback
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()


    if _err = tx.Exec(...); err != nil {
        return
    }
    if _err = tx.Exec(...); err != nil {
        return
    }
    // ...
    return
}

第三種寫法

寫法三是對寫法二的進一步封裝,寫法高級一點,缺點同上

func Transact(db *sql.DBtxFunc func(*sql.Txerror) (err error) {
    txerr := db.Begin()
    if err != nil {
        return
    }


    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p// re-throw panic after Rollback
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()


    err = txFunc(tx)
    return err
}


func DoSomething() error {
    return Transact(dbfunc (tx *sql.Txerror {
        if _err := tx.Exec(...); err != nil {
            return err
        }
        if _err := tx.Exec(...); err != nil {
            return err
        }
    })
}

我的寫法

經過總結和實驗,我采用了下面這種寫法,defer tx.Rollback() 使得事務回滾始終得到執行。當 tx.Commit() 執行后,tx.Rollback() 起到關閉事務的作用, 當程序因為某個錯誤中止,tx.Rollback() 起到回滾事務,同事關閉事務的作用。

普通場景

func DoSomething() (err error) {
  tx_ := db.Begin()
  defer tx.Rollback()

  if _err = tx.Exec(...); err != nil {
      return
  }
  if _err = tx.Exec(...); err != nil {
      return
  }
  // ...


  err = tx.Commit()
  return
}

循環場景

(1) 小事務 每次循環提交一次 在循環內部使用這種寫法的時候,defer 不能使用,所以要把事務部分抽離到獨立的函數當中

func DoSomething() (err error) {
    tx_ := db.Begin()
    defer tx.Rollback()

    if _err = tx.Exec(...); err != nil {
        return
    }
    if _err = tx.Exec(...); err != nil {
        return
    }
    // ...


    err = tx.Commit()
    return
}


for {
    if err := DoSomething(); err != nil{
         // ...
    }
}

(2) 大事務 批量提交 大事務的場景和普通場景是一樣的,沒有任何區別

func DoSomething() (err error) {
    tx_ := db.Begin()
    defer tx.Rollback()

    for{
        if _err = tx.Exec(...); err != nil {
            return
        }
        if _err = tx.Exec(...); err != nil {
            return
        }
        // ...
    }

    err = tx.Commit()
    return
}


責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2017-02-23 15:37:44

OptionObject容器

2017-07-10 13:09:45

前端Flexbox

2021-09-15 16:20:02

Spring BootFilterJava

2016-01-05 11:28:20

按需付費云計算docker

2018-01-11 15:31:39

命令Linux關機

2016-05-09 10:41:03

算法分析開發

2021-07-13 07:31:26

Springboot編程事務管理

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2020-08-31 06:54:37

注解脫敏ELK

2021-07-12 11:35:13

Go協程Goroutine

2017-10-12 11:30:34

Spark代碼PR

2021-01-08 08:10:34

MySQL表空間回收

2016-12-12 08:48:24

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2021-10-08 08:38:00

Pipelineshell命令Jenkins

2019-10-30 17:06:50

AWS物聯網IoT

2018-04-11 15:42:04

開源項目姿勢

2024-02-06 14:05:00

Go中間件框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区蜜桃视频 | 麻豆av一区二区三区久久 | 91精品久久久 | 国产九一精品 | 欧美精品日韩 | 国产美女在线播放 | 美人の美乳で授乳プレイ | 在线伊人 | 国产精品成人一区二区三区夜夜夜 | 国产一区二区三区久久久久久久久 | 免费国产精品久久久久久 | 国产精品亚洲成在人线 | 久久久成人动漫 | 欧美福利网站 | 亚洲另类视频 | 婷婷五月色综合香五月 | 玩丰满女领导对白露脸hd | 韩国av一区二区 | 精品一区在线免费观看 | 欧美成人一区二区 | 国产乱码精品一品二品 | 久草视频观看 | 视频在线一区二区 | 欧美日韩精品一区二区三区四区 | 青青草精品视频 | 国产精品久久久久久一区二区三区 | www.嫩草 | 欧美日韩在线观看视频网站 | 国精产品一品二品国精在线观看 | 久久久国产精品一区 | 国产视频精品区 | 777zyz色资源站在线观看 | 欧美理论 | 国产亚洲一区二区三区在线观看 | 午夜精品久久久 | 一区二区三区免费 | 九色在线视频 | 亚洲电影成人 | 中文字幕在线观看视频网站 | 围产精品久久久久久久 | 美女天堂 |