91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解golang事務(wù)的三種寫(xiě)法

馬哥Linux運(yùn)維 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-03-16 08:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文中作者展示了golang事務(wù)的三種寫(xiě)法。

第一種寫(xiě)法

這種寫(xiě)法非常樸實(shí),程序流程也非常明確,但是事務(wù)處理與程序流程嵌入太深,容易遺漏,造成嚴(yán)重的問(wèn)題

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
}

第二種寫(xiě)法

下面這種寫(xiě)法把事務(wù)處理從程序流程抽離了出來(lái),不容易遺漏,但是作用域是整個(gè)函數(shù),程序流程不是很清晰

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
}

第三種寫(xiě)法

寫(xiě)法三是對(duì)寫(xiě)法二的進(jìn)一步封裝,寫(xiě)法高級(jí)一點(diǎn),缺點(diǎn)同上

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
}
})
}

我的寫(xiě)法

經(jīng)過(guò)總結(jié)和實(shí)驗(yàn),我采用了下面這種寫(xiě)法,defer tx.Rollback() 使得事務(wù)回滾始終得到執(zhí)行。當(dāng) tx.Commit() 執(zhí)行后,tx.Rollback() 起到關(guān)閉事務(wù)的作用, 當(dāng)程序因?yàn)槟硞€(gè)錯(cuò)誤中止,tx.Rollback() 起到回滾事務(wù),同事關(guān)閉事務(wù)的作用。

普通場(chǎng)景

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
}

循環(huán)場(chǎng)景

(1) 小事務(wù) 每次循環(huán)提交一次 在循環(huán)內(nèi)部使用這種寫(xiě)法的時(shí)候,defer 不能使用,所以要把事務(wù)部分抽離到獨(dú)立的函數(shù)當(dāng)中

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) 大事務(wù) 批量提交 大事務(wù)的場(chǎng)景和普通場(chǎng)景是一樣的,沒(méi)有任何區(qū)別

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
}

原文標(biāo)題:Golang transaction 事務(wù)使用的正確姿勢(shì)

文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    128

    文章

    9248

    瀏覽量

    148614
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85232
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67501

原文標(biāo)題:Golang transaction 事務(wù)使用的正確姿勢(shì)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    TCPIP詳解:TCP事務(wù)協(xié)議,HTTP,NNTP和UNIX域協(xié)議

    TCPIP詳解:TCP事務(wù)協(xié)議,HTTP,NNTP和UNIX域協(xié)議
    發(fā)表于 09-28 12:45

    常見(jiàn)三種接口詳解

    做單片機(jī)開(kāi)發(fā)時(shí)UART,SPI和I2C都是我們最經(jīng)常使用到的硬件接口,我收集了相關(guān)的具體材料對(duì)這三種接口進(jìn)行了詳細(xì)的解釋。
    發(fā)表于 08-02 08:13

    Spring事務(wù)管理詳解說(shuō)明

    Spring事務(wù)管理詳解
    發(fā)表于 05-20 13:46

    伺服電機(jī)的三種控制方式詳解

    伺服電機(jī)的三種控制方式
    發(fā)表于 01-21 06:45

    STM32的三種boot模式介紹

    淺識(shí)STM32的三種boot模式文章目錄淺識(shí)STM32的三種boot模式任務(wù)摘要一、認(rèn)識(shí)boot1.三種BOOT模式介紹2.開(kāi)發(fā)BOOT模式選擇3.STM32三種啟動(dòng)模式4.
    發(fā)表于 12-10 07:46

    半導(dǎo)體極管的三種基本放大電路的三種連接法電路圖

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

    三種投影機(jī)散熱技術(shù)是哪三種

    三種投影機(jī)散熱技術(shù)是哪三種 如今在日常的學(xué)習(xí)、工作、生活中,投影機(jī)的應(yīng)用越來(lái)越頻繁。由于投影機(jī)屬于高
    發(fā)表于 02-06 10:33 ?661次閱讀

    三種不同的“防 Ping”技巧

    三種不同的“防 Ping”技巧 淺析三種不同的“防 Ping”方法   眾所周知,Ping命令是一個(gè)非常有用的網(wǎng)絡(luò)命令,大家常用它
    發(fā)表于 04-14 13:53 ?1326次閱讀

    淺析單片機(jī)三種應(yīng)用程序的架構(gòu)

    在工作中經(jīng)過(guò)摸索實(shí)驗(yàn),總結(jié)出單片機(jī)大致應(yīng)用程序的架構(gòu)有三種: 1. 簡(jiǎn)單的前后臺(tái)順序執(zhí)行程序,這類(lèi)寫(xiě)法是大多
    的頭像 發(fā)表于 04-07 09:44 ?5236次閱讀

    PCB常見(jiàn)的三種鉆孔詳解資料下載

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

    MySQL三種日志講解

    MySQL 日志包含了錯(cuò)誤日志、查詢(xún)?nèi)罩?、慢查?xún)?nèi)罩尽?b class='flag-5'>事務(wù)日志、二進(jìn)制日志等,如果存儲(chǔ)引擎使用的是 InnoDB ,二進(jìn)制日志(binlog)和事務(wù)日志(包括redo log和undo log) 是肯定繞不過(guò)去的,本篇接下來(lái)詳細(xì)為大家介紹這
    的頭像 發(fā)表于 07-25 11:15 ?1545次閱讀
    MySQL<b class='flag-5'>三種</b>日志講解

    insertinto語(yǔ)句的三種寫(xiě)法

    插入數(shù)據(jù)是關(guān)系數(shù)據(jù)庫(kù)基本的操作之一,它允許用戶(hù)將數(shù)據(jù)插入已經(jīng)創(chuàng)建的表中。在關(guān)系數(shù)據(jù)庫(kù)中,通過(guò)使用INSERT INTO語(yǔ)句可以將數(shù)據(jù)插入到表中的一個(gè)或多個(gè)列中。 INSERT INTO語(yǔ)句有三種常見(jiàn)
    的頭像 發(fā)表于 11-17 15:12 ?6054次閱讀

    insert into 語(yǔ)句的三種寫(xiě)法

    INSERT INTO是MySQL中常用的一SQL語(yǔ)句,用于將數(shù)據(jù)插入到表中。此文將詳細(xì)介紹INSERT INTO語(yǔ)句的三種不同寫(xiě)法及其用途,并提供代碼示例和相關(guān)解釋。 正文: 一、基本插入
    的頭像 發(fā)表于 11-21 14:18 ?1.6w次閱讀

    redis三種集群方案詳解

    在Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過(guò)10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1529次閱讀
    redis<b class='flag-5'>三種</b>集群方案<b class='flag-5'>詳解</b>