詳解如何利用GORM實現(xiàn)MySQL事務
前言
為了確保數(shù)據(jù)一致性,在項目中會經(jīng)常用到事務處理,回滾操作還是比較常見的需求;事務處理可以用來維護數(shù)據(jù)庫的完整性,保證成批的sql語句要么全部都執(zhí)行,要么全不執(zhí)行,對于MySQL事務相信大家應該都不陌生,這篇文章主要總結一下在Go語言中Gorm是如何實現(xiàn)事務的;感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
禁用默認事務
gorm事務默認是開啟的。為了確保數(shù)據(jù)一致性,Gorm會在事務里執(zhí)行寫入操作(增刪改)。
如果對數(shù)據(jù)一致性要求不高的話,可以在初始化時禁用它,性能將提升大約30%。
一般不推薦禁用。
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})自動事務
通過db.Transaction函數(shù)實現(xiàn)事務,如果閉包函數(shù)返回錯誤,則回滾事務。
db.Transaction(func(tx *gorm.DB) error {
// 在事務中執(zhí)行一些 db 操作(從這里開始,您應該使用 'tx' 而不是 'db')
if err := tx.Create(&User{Name: "Lili"}).Error; err != nil {
// 返回任何錯誤都會回滾事務
return err
}
if err := tx.Create(&User{Name: "xiaoming"}).Error; err != nil {
return err
}
// 返回 nil 提交事務
return nil
})手動事務
在開發(fā)中經(jīng)常需要數(shù)據(jù)庫事務來保證多個數(shù)據(jù)庫寫操作的原子性。例如電商系統(tǒng)中的扣減庫存和保存訂單。
gorm事務用法:
// 開啟事務
tx := db.Begin()
//在事務中執(zhí)行數(shù)據(jù)庫操作,使用的是tx變量,不是db。
//庫存減一
//等價于: 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,說明沒有庫存了,結束下單流程
//這里回滾作用不大,因為前面沒成功執(zhí)行什么數(shù)據(jù)庫更新操作,也沒什么數(shù)據(jù)需要回滾。
//這里就是舉個例子,事務中可以執(zhí)行多個sql語句,錯誤了可以回滾事務
tx.Rollback()
return
}
err := tx.Create(保存訂單).Error
//保存訂單失敗,則回滾事務
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}嵌套事務
GORM 支持嵌套事務,可以回滾較大事務內執(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 來提供保存點以及回滾至保存點,例如:
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ù)。
小結
關于Go GORM 事務詳細介紹的文章就介紹到這了,總的來說Gorm事務的實現(xiàn)非常簡單,go語言操作mysql事務主要用到了三個函數(shù):
- Db.Begin() 開始事務
- Db.Commit() 提交事務
- Db.Rollback() 回滾事務
到此這篇關于詳解如何利用GORM實現(xiàn)MySQL事務的文章就介紹到這了,更多相關Golang GORM實現(xiàn)MySQL事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Gin與Mysql實現(xiàn)簡單Restful風格API實戰(zhàn)示例詳解
這篇文章主要為大家介紹了Gin與Mysql實現(xiàn)簡單Restful風格API示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步2021-11-11
Go語言遍歷map實現(xiàn)(訪問map中的每一個鍵值對)
這篇文章主要介紹了Go語言遍歷map實現(xiàn)(訪問map中的每一個鍵值對),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)
很多朋友不知道如何使用Goland軟件,搭建一個ORM框架GORM,今天小編給大家分享一篇教程關于搭建Go語言的ORM框架Gorm的具體步驟(從Java到go),感興趣的朋友跟隨小編一起學習下吧2022-09-09
go-zero使用goctl生成mongodb的操作使用方法
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應用于web應用、大數(shù)據(jù)以及云計算領域,goctl model 為 goctl 提供的數(shù)據(jù)庫模型代碼生成指令,目前支持 MySQL、PostgreSQL、Mongo 的代碼生成,本文給大家介紹了go-zero使用goctl生成mongodb的操作使用方法2024-06-06

