事务处理示例
下面是一个使用Gorm进行事务处理的示例代码,该代码演示了如何使用显式事务和隐式事务处理方法。:
代码语言:javascript复制package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
Age int
}
var db *gorm.DB
func main() {
var err error
// 连接数据库
dsn := "user:password@tcp(host:port)/database"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
defer db.Close()
// 显式事务处理
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Model(&User{}).Where("name = ?", "Tom").Update("age", 18).Error; err != nil {
tx.Rollback()
panic(err)
}
if err := tx.Model(&User{}).Where("name = ?", "Jerry").Update("age", 20).Error; err != nil {
tx.Rollback()
panic(err)
}
if err := tx.Commit().Error; err != nil {
tx.Rollback()
panic(err)
}
fmt.Println("显式事务处理成功!")
// 隐式事务处理
if err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Model(&User{}).Where("name = ?", "Tom").Update("age", 22).Error; err != nil {
return err
}
if err := tx.Model(&User{}).Where("name = ?", "Jerry").Update("age", 24).Error; err != nil {
return err
}
return nil
}); err != nil {
panic(err)
}
fmt.Println("隐式事务处理成功!")
}
在该示例代码中,我们演示了两种事务处理方法:显式事务处理和隐式事务处理。
显式事务处理使用Begin
方法开始一个事务,并使用Commit
方法提交事务。在事务处理过程中,如果发生错误,则使用Rollback
方法回滚事务。在该示例代码中,我们将名为Tom和Jerry的用户的年龄分别更新为18和20,然后提交事务。如果事务处理成功,则打印“显式事务处理成功!”的信息。
隐式事务处理使用Transaction
方法执行一个函数,并在该函数内部进行事务处理。在该函数内部,我们将名为Tom和Jerry的用户的年龄分别更新为22和24。如果函数执行成功,则隐式提交事务。在该示例代码中,我们使用Transaction
方法执行了一个匿名函数,并在该函数内部进行了事务处理。如果事务处理成功,则打印“隐式事务处理成功!”的信息。