fix: 修复数据库配置和事务一致性问题

数据库配置:
- SQLite 开启 WAL 模式,读写可并发
- 设置 busy_timeout=5000ms 避免锁超时
- 设置 synchronous=NORMAL 平衡性能和安全
- SQLite MaxOpenConns 设为 1 避免并发写入冲突

事务修复:
- auth.go: 注册流程(用户+设备+会话)加入事务
- auth.go: 密码重置(修改密码+标记验证码)加入事务
- cards.go: 卡密使用加入事务,补充 UsedAt 字段
- cards.go: 代理商批量生成(扣款+生成卡密)加入事务
- extension.go: 充值(修改余额+记录)加入事务
- extension.go: 扣费(修改余额+记录)加入事务
- storage_config.go: 设置默认存储加入事务
This commit is contained in:
2026-05-06 08:12:04 +08:00
parent 4841920727
commit 98986b0eb7
5 changed files with 175 additions and 44 deletions
+10 -5
View File
@@ -59,7 +59,7 @@ func initSQLite() {
dbPath := filepath.Join(dataDir, "verification_platform.db")
var errOpen error
DB, errOpen = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
DB, errOpen = gorm.Open(sqlite.Open(dbPath+"?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
DisableForeignKeyConstraintWhenMigrating: true,
})
@@ -70,7 +70,7 @@ func initSQLite() {
if sqlDB, err := DB.DB(); err == nil {
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetMaxOpenConns(1)
sqlDB.SetConnMaxLifetime(time.Hour)
}
@@ -132,7 +132,7 @@ func initAutoDetect() {
dataDir := config.GetDataDir()
dbPath := filepath.Join(dataDir, "verification_platform.db")
DB, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
DB, err = gorm.Open(sqlite.Open(dbPath+"?_journal_mode=WAL&_busy_timeout=5000&_synchronous=NORMAL"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
DisableForeignKeyConstraintWhenMigrating: true,
})
@@ -143,8 +143,13 @@ func initAutoDetect() {
}
if sqlDB, err := DB.DB(); err == nil {
sqlDB.SetMaxIdleConns(config.GetInt("database.max_idle_conns"))
sqlDB.SetMaxOpenConns(config.GetInt("database.max_open_conns"))
if config.GetString("database.type") == "sqlite" || config.GetString("database.type") == "" {
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(1)
} else {
sqlDB.SetMaxIdleConns(config.GetInt("database.max_idle_conns"))
sqlDB.SetMaxOpenConns(config.GetInt("database.max_open_conns"))
}
sqlDB.SetConnMaxLifetime(time.Hour)
}