激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)

golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)

2022-01-22 16:24yuchenfw Golang

這篇文章主要介紹了golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

事務(wù)處理的流程示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
database := db.DB
tx, err := database.Begin()
if err != nil {
    return err
}
stmt, err := tx.Prepare(sqlQuery)
if err != nil {
    tx.Rollback()
    return err
}
_, err = stmt.Exec(paras...)
if err != nil {
    tx.Rollback()
    return err
}
err = tx.Commit()
if err != nil {
    tx.Rollback()
    return err
}

以上是我們使用事務(wù)時(shí)的一般操作,如果每做一次事務(wù)的操作均要進(jìn)行重新寫一遍代碼豈不是很麻煩,尤其是出錯(cuò)時(shí),Rollback需要多次在不同錯(cuò)誤的地方的進(jìn)行調(diào)用處理。

簡單封裝

偷懶第一步

采用defer處理Rollback

?
1
defer tx.Rollback()

無論成功與否,均進(jìn)行Rollback操作,只是有點(diǎn)影響,如果成功還調(diào)用Rollback的話,將會(huì)報(bào)錯(cuò)。雖然可以忽略,但作為程序員,有必要進(jìn)一步調(diào)整。

偷懶第二步

根據(jù)執(zhí)行結(jié)果來選擇執(zhí)行Rollback,避免無效使用。

?
1
2
3
4
5
6
defer func() { //根據(jù)執(zhí)行結(jié)果選擇執(zhí)行Rollback
        if err != nil && tx != nil {
        log.Println("ExecSqlWithTransaction defer err :", err)
            tx.Rollback()
        }
    }()

如此,我們就可以根據(jù)事務(wù)的執(zhí)行結(jié)果決定是否Rollback了。

偷懶第三步

封裝,以上代碼本身就具有極大的普適性,因此,我們抽出通用的參數(shù),將此過程封裝成一個(gè)func,以后就可以直接調(diào)用了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func ExecSqlWithTransaction(database *sql.DB, query string, args ...interface{}) (err error) {
    tx, err := database.Begin()
    if err != nil {
        return err
    }
    defer func() {
        if err != nil && tx != nil {
            tx.Rollback()
        }
    }()
    stmt, err := tx.Prepare(query)
    if err != nil {
        return err
    }
    defer stmt.Close()
    _, err = stmt.Exec(args...)
    if err != nil {
        return err
    }
    return tx.Commit()
}

封裝后我們可以如下使用:

?
1
2
3
if err := ExecSqlWithTransaction(database,sqlQuery,paras...);err != nil{
    //錯(cuò)誤處理
}

封裝后是不是很簡潔啊?

進(jìn)一步封裝

在一個(gè)事務(wù)中可能會(huì)出現(xiàn)多個(gè)SELECT、UPDATE等操作,以上封裝僅處理了一種操作,還不能滿足我們的實(shí)際需求,因此需要更進(jìn)一步封裝。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func ExecSqlWithTransaction(db *sql.DB, handle func(tx *sql.Tx) error) (err error) {
 tx, err := db.Begin()
 if err != nil {
  return err
 }
 defer func() {
  if err != nil {
   tx.Rollback()
  }
 }()
 if err = handle(tx); err != nil {
  return err
 }
 return tx.Commit()
}

在handle func內(nèi)可以直接使用事務(wù)tx進(jìn)行增刪改查。

到此這篇關(guān)于golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang db事務(wù)封裝內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/xz_studying/article/details/90610993

延伸 · 閱讀

精彩推薦
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識(shí)符允許由...

    4272021-11-24
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨(dú)尊11682021-06-09
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产精品jk白丝蜜臀av软件 | 91精品国产99久久久久久 | 成人在线免费观看网址 | 深夜影院一级毛片 | 免费国产之a视频 | 国产女同疯狂激烈互摸 | 亚洲一级毛片 | 久久老司机| 国产九色视频在线观看 | 久久久久久久久久亚洲精品 | 成年免费看 | 欧美 国产 综合 | 免费看性xxx高清视频自由 | 福利国产在线 | 日产精品久久久一区二区福利 | 日日碰日日操 | 精品国产一区二区三区四区在线 | 911精品影院在线观看 | 国产亚洲精品久久久久婷婷瑜伽 | 成人污在线 | 禁漫天堂久久久久久久久久 | 操碰| 国产91久久精品一区二区 | 国产69精品久久久久久久久久 | 色综合久久99 | 国产精品视频一区二区噜噜 | 一级黄色播放 | 欧美色另类 | 欧美亚洲另类在线 | 欧美精品v国产精品v日韩精品 | 成人男女啪啪免费观看网站四虎 | 亚洲一区二区免费 | 蜜桃视频在线入口www | 91一区二区三区久久久久国产乱 | 369看片你懂的小视频在线观看 | 国内精品免费一区二区2001 | 日韩在线黄色片 | av电影直播 | 宅男噜噜噜66国产免费观看 | 欧美一级不卡视频 | 亚洲第一男人天堂 |