當使用C++的sqlite庫時,在sqlite3_stmt
上調用sqlite3_step
可能會以幾種不同的方式失敗。就我的理解而言,除了一個之外,他們都應該導致例外或者由編程錯誤引起。塊sqlite步驟,直到數據庫不再繁忙
然而,其中一個令我感到困惑:SQLITE_BUSY
。我的意思是:SQLITE_BUSY
只是意味着數據庫被鎖定,因爲一些事務已經在它上面發生了,對吧?假設某個不同的流程已經開始交易並且尚未提交或發佈,則任何試圖編輯數據庫或開始新交易的sqlite3_step
調用都將失敗,並且SQLITE_BUSY
將失敗。
但是,這對我來說不是一個錯誤:當一個資源被使用時,我可以......等等!與互斥體不同(可能更復雜),我想應該可以阻止當前線程/進程的執行,直到再次訪問共享資源爲止。
有沒有辦法做這樣的事情?我想要的是以下形式:
sqlite3_step_or_block_until_available_then_step(my_stmt);
因此,執行被阻止,直到數據庫不再忙,我可以使用它。有沒有由sqlite庫本身提供的解決方案?如果不是,我該怎麼辦?我的意思是,我顯然可以忙着等到SQLITE_BUSY
錯誤不再返回,但它並沒有什麼意義,因爲它消耗了大量資源。是否有更多的表現方式來實現這一目標?
如果可能,請提供一些簡短的示例,以便我能夠理解如何使其發揮作用!
你周圍應提供自己的鎖定機制訪問數據庫。 –