最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何利用GORM實(shí)現(xiàn)MySQL事務(wù)

 更新時(shí)間:2022年09月07日 14:12:36   作者:1個(gè)俗人  
為了確保數(shù)據(jù)一致性,在項(xiàng)目中會(huì)經(jīng)常用到事務(wù)處理,對于MySQL事務(wù)相信大家應(yīng)該都不陌生。這篇文章主要總結(jié)一下在Go語言中Gorm是如何實(shí)現(xiàn)事務(wù)的;感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助

前言

為了確保數(shù)據(jù)一致性,在項(xiàng)目中會(huì)經(jīng)常用到事務(wù)處理,回滾操作還是比較常見的需求;事務(wù)處理可以用來維護(hù)數(shù)據(jù)庫的完整性,保證成批的sql語句要么全部都執(zhí)行,要么全不執(zhí)行,對于MySQL事務(wù)相信大家應(yīng)該都不陌生,這篇文章主要總結(jié)一下在Go語言中Gorm是如何實(shí)現(xiàn)事務(wù)的;感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

禁用默認(rèn)事務(wù)

gorm事務(wù)默認(rèn)是開啟的。為了確保數(shù)據(jù)一致性,Gorm會(huì)在事務(wù)里執(zhí)行寫入操作(增刪改)。

如果對數(shù)據(jù)一致性要求不高的話,可以在初始化時(shí)禁用它,性能將提升大約30%。

一般不推薦禁用。

// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  SkipDefaultTransaction: true,
})

自動(dòng)事務(wù)

通過db.Transaction函數(shù)實(shí)現(xiàn)事務(wù),如果閉包函數(shù)返回錯(cuò)誤,則回滾事務(wù)。

db.Transaction(func(tx *gorm.DB) error {
  // 在事務(wù)中執(zhí)行一些 db 操作(從這里開始,您應(yīng)該使用 'tx' 而不是 'db')
  if err := tx.Create(&User{Name: "Lili"}).Error; err != nil {
    // 返回任何錯(cuò)誤都會(huì)回滾事務(wù)
    return err
  }

  if err := tx.Create(&User{Name: "xiaoming"}).Error; err != nil {
    return err
  }

  // 返回 nil 提交事務(wù)
  return nil
})

手動(dòng)事務(wù)

在開發(fā)中經(jīng)常需要數(shù)據(jù)庫事務(wù)來保證多個(gè)數(shù)據(jù)庫寫操作的原子性。例如電商系統(tǒng)中的扣減庫存和保存訂單。

gorm事務(wù)用法:

// 開啟事務(wù)
tx := db.Begin()

//在事務(wù)中執(zhí)行數(shù)據(jù)庫操作,使用的是tx變量,不是db。

//庫存減一
//等價(jià)于: UPDATE `goods` SET `stock` = stock - 1  WHERE `goods`.`id` = '2' and stock > 0
//RowsAffected用于返回sql執(zhí)行后影響的行數(shù)
rowsAffected := tx.Model(&goods).Where("stock > 0").Update("stock", gorm.Expr("stock - 1")).RowsAffected
if rowsAffected == 0 {
    //如果更新庫存操作,返回影響行數(shù)為0,說明沒有庫存了,結(jié)束下單流程
    //這里回滾作用不大,因?yàn)榍懊鏇]成功執(zhí)行什么數(shù)據(jù)庫更新操作,也沒什么數(shù)據(jù)需要回滾。
    //這里就是舉個(gè)例子,事務(wù)中可以執(zhí)行多個(gè)sql語句,錯(cuò)誤了可以回滾事務(wù)
    tx.Rollback()
    return
}
err := tx.Create(保存訂單).Error

//保存訂單失敗,則回滾事務(wù)
if err != nil {
    tx.Rollback()
} else {
    tx.Commit()
}

嵌套事務(wù)

GORM 支持嵌套事務(wù),可以回滾較大事務(wù)內(nèi)執(zhí)行的一部分操作,例如:

db.Transaction(func(tx *gorm.DB) error {
  tx.Create(&user1)

  tx.Transaction(func(tx2 *gorm.DB) error {
    tx2.Create(&user2)
    return errors.New("rollback user2") // Rollback user2
  })

  tx.Transaction(func(tx2 *gorm.DB) error {
    tx2.Create(&user3)
    return nil
  })

  return nil
})

// Commit user1, user3

SavePoint、RollbackTo

GORM 提供了 SavePoint、Rollbackto 來提供保存點(diǎn)以及回滾至保存點(diǎn),例如:

tx := db.Begin()
tx.Create(&user1)
 
tx.SavePoint("sp1") 
tx.Create(&user2)
tx.RollbackTo("sp1") // Rollback user2
 
tx.Commit() // Commit user1

這里rollback到了sp1的位置,也就是說,數(shù)據(jù)庫中只存了user1這條數(shù)據(jù)。

小結(jié)

關(guān)于Go GORM 事務(wù)詳細(xì)介紹的文章就介紹到這了,總的來說Gorm事務(wù)的實(shí)現(xiàn)非常簡單,go語言操作mysql事務(wù)主要用到了三個(gè)函數(shù):

  • Db.Begin() 開始事務(wù)
  • Db.Commit() 提交事務(wù)
  • Db.Rollback() 回滾事務(wù)

到此這篇關(guān)于詳解如何利用GORM實(shí)現(xiàn)MySQL事務(wù)的文章就介紹到這了,更多相關(guān)Golang GORM實(shí)現(xiàn)MySQL事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go-zero自定義中間件的幾種方式

    go-zero自定義中間件的幾種方式

    首先 go-zero 已經(jīng)為我們提供了很多的中間件的實(shí)現(xiàn),但有時(shí)難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-07-07
  • Gin與Mysql實(shí)現(xiàn)簡單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    Gin與Mysql實(shí)現(xiàn)簡單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    這篇文章主要為大家介紹了Gin與Mysql實(shí)現(xiàn)簡單Restful風(fēng)格API示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Go語言遍歷map實(shí)現(xiàn)(訪問map中的每一個(gè)鍵值對)

    Go語言遍歷map實(shí)現(xiàn)(訪問map中的每一個(gè)鍵值對)

    這篇文章主要介紹了Go語言遍歷map實(shí)現(xiàn)(訪問map中的每一個(gè)鍵值對),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解Golang如何在編譯時(shí)注入版本信息

    詳解Golang如何在編譯時(shí)注入版本信息

    這篇文章主要為大家詳細(xì)介紹了Golang如何在編譯時(shí)實(shí)現(xiàn)注入版本信息,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-06-06
  • Go語言LeetCode題解706設(shè)計(jì)哈希映射

    Go語言LeetCode題解706設(shè)計(jì)哈希映射

    這篇文章主要為大家介紹了Go語言LeetCode題解706設(shè)計(jì)哈希映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語言中嵌入式緩存庫的用法詳解

    Go語言中嵌入式緩存庫的用法詳解

    Go?語言中有一些非常高效的嵌入式緩存庫,groupcache?和?bigcache?是兩個(gè)非常流行且高性能的庫,本文將詳細(xì)介紹一下二者的用法,有需要的小伙伴可以參考下
    2025-01-01
  • 搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    很多朋友不知道如何使用Goland軟件,搭建一個(gè)ORM框架GORM,今天小編給大家分享一篇教程關(guān)于搭建Go語言的ORM框架Gorm的具體步驟(從Java到go),感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-09-09
  • go-zero使用goctl生成mongodb的操作使用方法

    go-zero使用goctl生成mongodb的操作使用方法

    mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,goctl model 為 goctl 提供的數(shù)據(jù)庫模型代碼生成指令,目前支持 MySQL、PostgreSQL、Mongo 的代碼生成,本文給大家介紹了go-zero使用goctl生成mongodb的操作使用方法
    2024-06-06
  • Golang內(nèi)存泄露場景與定位方式的實(shí)現(xiàn)

    Golang內(nèi)存泄露場景與定位方式的實(shí)現(xiàn)

    Golang有自動(dòng)垃圾回收機(jī)制,但是仍然可能會(huì)出現(xiàn)內(nèi)存泄漏的情況,本文主要介紹了Golang內(nèi)存泄露場景與定位方式的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • golang中sync.Mutex的實(shí)現(xiàn)方法

    golang中sync.Mutex的實(shí)現(xiàn)方法

    本文主要介紹了golang中sync.Mutex的實(shí)現(xiàn)方法,mutex?主要有兩個(gè)?method:?Lock()?和?Unlock(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

丰顺县| 通渭县| 合江县| 连州市| 惠州市| 封丘县| 德江县| 百色市| 巴塘县| 南丰县| 卢龙县| 许昌县| 建昌县| 巩留县| 库伦旗| 东辽县| 烟台市| 阿拉尔市| 东兴市| 海淀区| 临澧县| 马关县| 罗源县| 乡城县| 淅川县| 吕梁市| 桦南县| 梁山县| 宜兰市| 右玉县| 无棣县| 杭锦旗| 图片| 永和县| 桃源县| 县级市| 万源市| 龙胜| 江津市| 兴文县| 日照市|