package mysqlrym import ( "fmt" "git.168cad.top/zhengqiuyun/rym-util/conf" "git.168cad.top/zhengqiuyun/rym-util/log" "git.168cad.top/zhengqiuyun/rym-util/util" "gorm.io/driver/mysql" "gorm.io/gorm" "os" "sync" "time" "gorm.io/gorm/logger" _log "log" ) func TestLog() { log.Info("Mysql 测试") } var customerDb *gorm.DB var customerDbMap sync.Map var gidNeedTX sync.Map func SetTx() { gid := util.GetGID() gidNeedTX.Store(gid, 1) } func GetDb() *gorm.DB { return getDb(customerDb, &customerDbMap) } func getDb(db *gorm.DB, dbMap *sync.Map) *gorm.DB { gid := util.GetGID() _, needTx := gidNeedTX.Load(gid) if needTx { cacheTx, ok := dbMap.Load(gid) if ok { return cacheTx.(*gorm.DB) } else { if conf.LogShowSql { db = db.Debug() } tx := db.Begin() dbMap.Store(gid, tx) return tx } } else { if conf.LogShowSql { db = db.Debug() } return db } } func Rollback() { gid := util.GetGID() _, needTx := gidNeedTX.Load(gid) if needTx { rollbackTx(gid, &customerDbMap) gidNeedTX.Delete(gid) } } func Commit() { gid := util.GetGID() _, needTx := gidNeedTX.Load(gid) if needTx { commitTx(gid, &customerDbMap) gidNeedTX.Delete(gid) } } func rollbackTx(gid uint64, dbMap *sync.Map) { cacheTx, ok := dbMap.Load(gid) if ok { tx := cacheTx.(*gorm.DB) tx.Rollback() dbMap.Delete(gid) } } func commitTx(gid uint64, dbMap *sync.Map) { cacheTx, ok := dbMap.Load(gid) if ok { tx := cacheTx.(*gorm.DB) tx.Commit() dbMap.Delete(gid) } } func init() { newLogger := logger.New( _log.New(os.Stdout, "", _log.Lmicroseconds), // io writer(日志输出的目标,前缀和日志包含的内容——译者注) logger.Config{ SlowThreshold: time.Second, // 慢 SQL 阈值 LogLevel: logger.Error, // 日志级别 IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 Colorful: conf.LogColorful, // 是否开启彩色打印 }, ) var err error customerDb, err = gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%d)/duocaihui_dev?charset=utf8mb4&parseTime=True&loc=Local", conf.MySql.User, conf.MySql.Password, conf.MySql.Host, conf.MySql.Port)), &gorm.Config{ Logger: newLogger, }) if err != nil { log.Error(fmt.Sprintf("%s connect error:%s", "Mysql server", err.Error())) } else { log.Info(fmt.Sprintf("%s connect success", "Mysql server")) } }