package main
import (
"errors"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
gorm.Model
Name string
}
func createTable() {
db.AutoMigrate(&User{})
}
// 手动事务
func test1() {
// 开始事务
tx := db.Begin()
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
err := tx.Create(&User{Name: "王帆"}).Error
if err != nil {
// 遇到错误时回滚事务
tx.Rollback()
log.Fatal(err)
}
// 否则,提交事务
tx.Commit()
}
func test2() {
db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
if err := tx.Create(&User{Name: "王帆1"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Create(&User{Name: "王帆2"}).Error; err != nil {
return err
}
// 返回 nil 提交事务
return nil
})
}
// 嵌套事务
func test3() {
db.Transaction(func(tx *gorm.DB) error {
tx.Create(&User{Name: "王帆3"})
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&User{Name: "王帆4"})
return errors.New("rollback user2") // Rollback user2
})
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&User{Name: "王帆5"})
return nil
})
return nil
})
}
func main() {
// 创建表
createTable()
test1()
test2()
test3()
}
数据库数据