71 lines
1.4 KiB
Go
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!")
|
|
}
|
|
}
|