Files
learn-golang/go-gorm-demo/transaction_basic.go
2025-12-26 17:56:02 +08:00

71 lines
1.4 KiB
Go

package main
import (
"fmt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
//type User struct {
// ID uint `gorm:"primaryKey"`
// Name string `gorm:"size:100"`
// Email string `gorm:"size:100;unique"`
// Age int
//}
//
//type Account struct {
// ID uint `gorm:"primaryKey"`
// UserID uint
// Balance int
//}
func main() {
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
db.AutoMigrate(&User{}, &Account{})
// 1. 手动事务
tx := db.Begin()
// 创建用户
user := User{Name: "Alice", Email: "alice@example.com"}
if err := tx.Create(&user).Error; err != nil {
tx.Rollback()
panic(err)
}
// 创建账户
account := Account{UserID: user.ID, Balance: 1000}
if err := tx.Create(&account).Error; err != nil {
tx.Rollback()
panic(err)
}
// 提交事务
tx.Commit()
fmt.Println("Transaction committed successfully!")
// 2. 自动事务(推荐)
err := db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行操作
user2 := User{Name: "Bob", Email: "bob@example.com"}
if err := tx.Create(&user2).Error; err != nil {
return err // 自动回滚
}
account2 := Account{UserID: user2.ID, Balance: 2000}
if err := tx.Create(&account2).Error; err != nil {
return err // 自动回滚
}
// 返回 nil 自动提交
return nil
})
if err != nil {
fmt.Println("Transaction failed:", err)
} else {
fmt.Println("Auto transaction committed successfully!")
}
}