1 回答
TA贡献1827条经验 获得超7个赞
根据您的回购协议中的评论,问题似乎出在这里:
tx, err := db.Begin(true)
if err != nil {
return fmt.Errorf("bolt: failed to start transaction")
}
bkt := tx.Bucket([]byte(bkt))
c := bkt.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
// do stuff with bucket...
fmt.Println(v) // check if v matches condition, delete if does
if err := tx.Commit(); err != nil { // BUG: commiting transaction in a loop
tx.Rollback()
return fmt.Errorf("bolt: failed to commit transaction: %w", err)
}
timeout = time.After(time.Second * 5)
}
循环可以迭代 0 次。
如果没有迭代 -
tx
不提交timeout
也不重置(因此case <-timeout:
不会再次触发)。如果有多次迭代 - 您将尝试
tx.Commit()
多次(错误)。
这可能导致了您看到的问题;bolt
Close
功能:_
关闭释放所有数据库资源。在关闭数据库之前必须关闭所有事务。
因此,如果有一个事务运行Close
块直到完成(内部螺栓在事务开始时锁定互斥锁并在完成时释放它)。
解决方案是确保事务始终关闭(并且只关闭一次)。
- 1 回答
- 0 关注
- 74 浏览
添加回答
举报