在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解golang事務的三種寫法

馬哥Linux運維 ? 來源:CSDN ? 作者:CSDN ? 2022-03-16 08:52 ? 次閱讀

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

第一種寫法

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

funcDoSomething()(errerror){
tx,err:=db.Begin()
iferr!=nil{
return
}


deferfunc(){
ifp:=recover();p!=nil{
tx.Rollback()
panic(p)//re-throwpanicafterRollback
}
}()


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


err=tx.Commit()
return
}

第二種寫法

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

funcDoSomething()(errerror){
tx,err:=db.Begin()
iferr!=nil{
return
}


deferfunc(){
ifp:=recover();p!=nil{
tx.Rollback()
panic(p)//re-throwpanicafterRollback
}elseiferr!=nil{
tx.Rollback()
}else{
err=tx.Commit()
}
}()


if_,err=tx.Exec(...);err!=nil{
return
}
if_,err=tx.Exec(...);err!=nil{
return
}
//...
return
}

第三種寫法

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

funcTransact(db*sql.DB,txFuncfunc(*sql.Tx)error)(errerror){
tx,err:=db.Begin()
iferr!=nil{
return
}


deferfunc(){
ifp:=recover();p!=nil{
tx.Rollback()
panic(p)//re-throwpanicafterRollback
}elseiferr!=nil{
tx.Rollback()
}else{
err=tx.Commit()
}
}()


err=txFunc(tx)
returnerr
}


funcDoSomething()error{
returnTransact(db,func(tx*sql.Tx)error{
if_,err:=tx.Exec(...);err!=nil{
returnerr
}
if_,err:=tx.Exec(...);err!=nil{
returnerr
}
})
}

我的寫法

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

普通場景

funcDoSomething()(errerror){
tx,_:=db.Begin()
defertx.Rollback()

if_,err=tx.Exec(...);err!=nil{
return
}
if_,err=tx.Exec(...);err!=nil{
return
}
//...


err=tx.Commit()
return
}

循環場景

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

funcDoSomething()(errerror){
tx,_:=db.Begin()
defertx.Rollback()

if_,err=tx.Exec(...);err!=nil{
return
}
if_,err=tx.Exec(...);err!=nil{
return
}
//...


err=tx.Commit()
return
}


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

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

funcDoSomething()(errerror){
tx,_:=db.Begin()
defertx.Rollback()

for{
if_,err=tx.Exec(...);err!=nil{
return
}
if_,err=tx.Exec(...);err!=nil{
return
}
//...
}

err=tx.Commit()
return
}

原文標題:Golang transaction 事務使用的正確姿勢

文章出處:【微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 封裝
    +關注

    關注

    127

    文章

    7960

    瀏覽量

    143152
  • 程序
    +關注

    關注

    117

    文章

    3793

    瀏覽量

    81205
  • 函數
    +關注

    關注

    3

    文章

    4340

    瀏覽量

    62791

原文標題:Golang transaction 事務使用的正確姿勢

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【科普】三種電磁屏蔽的目的及原理詳解

    電磁屏蔽一般可分為三種:靜電屏蔽、靜磁屏蔽和高頻電磁場屏蔽。三種屏蔽的目的都是防止外界的電磁場進入到某個需要保護的區域中,原理都是利用屏蔽對外場的感應產生的效應來抵消外場的影響。但是由于所要屏蔽的場的特性不同,因而對屏蔽殼材料的要求和屏蔽效果也就不相同。
    發表于 09-29 11:21 ?4.6w次閱讀
    【科普】<b class='flag-5'>三種</b>電磁屏蔽的目的及原理<b class='flag-5'>詳解</b>

    TCPIP詳解:TCP事務協議,HTTP,NNTP和UNIX域協議

    TCPIP詳解:TCP事務協議,HTTP,NNTP和UNIX域協議
    發表于 09-28 12:45

    常見三種接口詳解

    做單片機開發時UART,SPI和I2C都是我們最經常使用到的硬件接口,我收集了相關的具體材料對這三種接口進行了詳細的解釋。
    發表于 08-02 08:13

    Spring事務管理詳解說明

    Spring事務管理詳解
    發表于 05-20 13:46

    伺服電機的三種控制方式詳解

    伺服電機的三種控制方式
    發表于 01-21 06:45

    STM32的三種boot模式介紹

    淺識STM32的三種boot模式文章目錄淺識STM32的三種boot模式任務摘要一、認識boot1.三種BOOT模式介紹2.開發BOOT模式選擇3.STM32三種啟動模式4.
    發表于 12-10 07:46

    半導體極管的三種基本放大電路的三種連接法電路圖

    半導體極管的三種基本放大電路的三種連接法電路圖
    發表于 05-06 14:55 ?5600次閱讀
    半導體<b class='flag-5'>三</b>極管的<b class='flag-5'>三種</b>基本放大電路的<b class='flag-5'>三種</b>連接法電路圖

    三種投影機散熱技術是哪三種

    三種投影機散熱技術是哪三種 如今在日常的學習、工作、生活中,投影機的應用越來越頻繁。由于投影機屬于高
    發表于 02-06 10:33 ?575次閱讀

    三種不同的“防 Ping”技巧

    三種不同的“防 Ping”技巧 淺析三種不同的“防 Ping”方法   眾所周知,Ping命令是一個非常有用的網絡命令,大家常用它
    發表于 04-14 13:53 ?1136次閱讀

    三種zigbee網絡架構詳解

    在萬物互聯的背景下,zigbee網絡應用越加廣泛,zigbee技術具有強大的組網能力,可以形成星型、樹型和網狀網,三種zigbee網絡結構各有優勢,可以根據實際項目需要來選擇合適的zigbee網絡結構。
    發表于 07-28 16:02 ?5.2w次閱讀
    <b class='flag-5'>三種</b>zigbee網絡架構<b class='flag-5'>詳解</b>

    淺析單片機三種應用程序的架構

    在工作中經過摸索實驗,總結出單片機大致應用程序的架構有三種: 1. 簡單的前后臺順序執行程序,這類寫法是大多
    的頭像 發表于 04-07 09:44 ?4468次閱讀

    PCB常見的三種鉆孔詳解資料下載

    電子發燒友網為你提供PCB常見的三種鉆孔詳解資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-18 08:45 ?22次下載
    PCB常見的<b class='flag-5'>三種</b>鉆孔<b class='flag-5'>詳解</b>資料下載

    MySQL三種日志講解

    MySQL 日志包含了錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志等,如果存儲引擎使用的是 InnoDB ,二進制日志(binlog)和事務日志(包括redo log和undo log) 是肯定繞不過去的,本篇接下來詳細為大家介紹這
    的頭像 發表于 07-25 11:15 ?765次閱讀
    MySQL<b class='flag-5'>三種</b>日志講解

    insertinto語句的三種寫法

    插入數據是關系數據庫基本的操作之一,它允許用戶將數據插入已經創建的表中。在關系數據庫中,通過使用INSERT INTO語句可以將數據插入到表中的一個或多個列中。 INSERT INTO語句有三種常見
    的頭像 發表于 11-17 15:12 ?3922次閱讀

    insert into 語句的三種寫法

    INSERT INTO是MySQL中常用的一SQL語句,用于將數據插入到表中。此文將詳細介紹INSERT INTO語句的三種不同寫法及其用途,并提供代碼示例和相關解釋。 正文: 一、基本插入
    的頭像 發表于 11-21 14:18 ?1.4w次閱讀
    主站蜘蛛池模板: 8050午夜一级| 一级做a爰片久久免费| 成人午夜免费剧场| 成在线人永久免费播放视频| 高黄网站| 中文字幕在线二区| 午夜湿| 免费视频黄| 在线 色| 四虎库| 免费欧美黄色网址| 国产裸体美女视频全黄| 一本到在线观看视频不卡| 日日日日人人人夜夜夜2017| 亚洲特黄大黄一级毛片| 永久免费看mv网站入口| 婷婷五月在线视频| 日本www.色| 国模视频一区| 在线理论视频| 免费看一级片| 国内精品91久久久久| 九月婷婷综合| 色婷婷视频在线观看| 老色皮永久免费网站| 99精品国产高清自在线看超| 欧美香蕉在线| 国产亚洲精品激情都市| 亚色中文| 超级毛片| 国产精品第9页| 四虎国产一区二区三区| 精品手机在线| 天天操天天插| 国产在线观看黄| 伊人久久成人| 你懂得视频在线| 97干97吻| 性欧美欧美| 曰韩毛片| 九色欧美|