1 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
根據(jù)您的回購協(xié)議中的評(píng)論,問題似乎出在這里:
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)
}
循環(huán)可以迭代 0 次。
如果沒有迭代 -
tx
不提交timeout
也不重置(因此case <-timeout:
不會(huì)再次觸發(fā))。如果有多次迭代 - 您將嘗試
tx.Commit()
多次(錯(cuò)誤)。
這可能導(dǎo)致了您看到的問題;bolt
Close
功能:_
關(guān)閉釋放所有數(shù)據(jù)庫資源。在關(guān)閉數(shù)據(jù)庫之前必須關(guān)閉所有事務(wù)。
因此,如果有一個(gè)事務(wù)運(yùn)行Close
塊直到完成(內(nèi)部螺栓在事務(wù)開始時(shí)鎖定互斥鎖并在完成時(shí)釋放它)。
解決方案是確保事務(wù)始終關(guān)閉(并且只關(guān)閉一次)。
- 1 回答
- 0 關(guān)注
- 109 瀏覽
添加回答
舉報(bào)