golang gorm 事务管理器
优势
- 业务代码与技术代码隔离
- 事务管理器抽象成接口,更具备可测试性
使用示例
具体可以看github里的单元测试
mainDB, err := gorm.Open(sqlite.Open("main.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
backupDB, err := gorm.Open(sqlite.Open("backup.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 构建事务管理器
txManager := NewGormTxManager(mainDB, backupDB)
ctx := context.TODO()
// open && close DB
ctx, txid := txManager.OpenMainTx(ctx)
defer txManager.CloseMainTx(ctx, txid, &err)
// Create sql
err := txManager.MustMainTx(ctx).WithContext(ctx).Create(&Product{Code: "D43", Price: 100}).Error
if err != nil {
return err
}
// Create sql
err = txManager.MustMainTx(ctx).WithContext(ctx).Create(&User{Name: "D42"}).Error