在本地进行批量读写测试时,发现:
database is locked
,这是 SQLite 的写锁独占机制在起作用通过 DeepSeek 建议,首先尝试 Write-Ahead Logging (WAL) 模式:
db, err := sql.Open("sqlite", "file:data.db?_journal_mode=WAL")
效果:
DELETE
日志模式,WAL 允许读写并发(读不阻塞写,写不阻塞读)DeepSeek 进一步建议:
实现代码示例:
// 使用事务批量写入
func batchUpdate(updates []Update) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback() // 出错时回滚
for _, u := range updates {
_, err = tx.Exec("UPDATE books SET views = views + ? WHERE id = ?", u.Views, u.ID)
if err != nil {
return err
}
}
return tx.Commit() // 统一提交
}
效果:
最终采纳的解决方案:
实现架构:
客户端请求 → 内存缓存(读写) → 定期同步 → SQLite
↓
关键数据直写
代码示例:
var (
cache = make(map[int]Book) // 简易内存缓存
mu sync.RWMutex
)
// 读取优先走缓存
func GetBook(id int) (Book, error) {
mu.RLock()
defer mu.RUnlock()
if book, ok := cache[id]; ok {
return book, nil
}
// 缓存未命中时查数据库
return fetchFromDB(id)
}
// 写入先更新缓存,异步持久化
func UpdateViews(id int) {
mu.Lock()
defer mu.Unlock()
cache[id].Views++ // 内存更新
// 触发异步落盘(实际可合并更多操作)
go func() {
_, err := db.Exec("UPDATE books SET views = views + 1 WHERE id = ?", id)
if err != nil {
log.Printf("异步写入失败: %v", err)
}
}()
}
database is locked
错误完全消失通过这次优化,深刻体会到:没有完美的技术方案,只有适合场景的权衡。AI 的建议提供了关键方向,但最终仍需结合实际测试调整。
还没有留言,来留下第一条吧!