當我在讀取數據庫的同時調用數據庫寫入時,SQLite 在我的機器中拋出一個扳手時遇到了麻煩。當不同的方法碰巧同時嘗試訪問數據庫時,就會發生這種情況。我正在做的類似于這個線程中正在做的事情,接受的答案解釋了如何使用數據庫事務來避免數據庫鎖定。這是我的一些代碼:stmt, err := dbtx.Prepare(`statement`)if err != nil { log.Fatal(err)}_, err = stmt.Exec(values, values, values)if err != nil { log.Fatal(err)}err = dbtx.Commit()if err != nil { fmt.Println("database lock?") fmt.Println(err) dbtx.Rollback()}fmt.Println("Database storage complete!")令人困惑的是程序在輸出后存在:database lock?database is lockedDatabase storage complete!2014/09/09 18:33:11 database is lockedexit status 1我不希望我的程序因數據庫鎖定而停止,我希望它將數據存儲在內存中并繼續其業務,直到數據庫解鎖,我可以再試一次。是否有一些標準的方法可以實現這一點,也許是某種隊列或數據結構,或者是否有特定于數據庫的方法來解決這個問題?為什么程序輸出后退出Database storage complete!?編輯:我相信我已經解決了這個問題,但我不能確定。我正在使用 goroutines 和包范圍的數據庫連接。以前,我的代碼中的每個 func 在被調用時都會初始化一個數據庫連接?,F在,我在包的頂部定義了一個用于 DB 連接的“全局”變量,并在任何例程開始之前進行了初始化。簡而言之,代碼如下:var nDB *sql.DB稍后在主函數中...mypkg.InitDB()go mypkg.RunDatabaseOperations()mypkg.BeginHTTPWatcher(rtr)InitDB() 定義如下:func InitDB() { fmt.Println("Init DB ...") var err error nDB, err = sql.Open("sqlite3", "./first.db") if err != nil { log.Fatal(err) } if nDB == nil { log.Fatal(err) } fmt.Printf("nDB: %v\n", ODB) fmt.Println("testing db connection...") err2 := nDB.Ping() if err2 != nil { log.Fatalf("Error on opening database connection: %s", err2.Error()) }}因此,RunDatabaseOperations定期掃描在線資源中的數據,并在發生更改時將其存儲到數據庫中(每隔幾秒一次)。BeginHTTPWatcher偵聽 HTTP 請求,因此可以從正在運行的程序中讀取數據,并通過網絡將數據傳輸到數據的請求者,無論是本地請求還是外部請求。我還沒有遇到問題。
2 回答

撒科打諢
TA貢獻1934條經驗 獲得超2個贊
該文件說:
單個連接實例及其所有派生對象(準備好的語句、備份操作等)不能在沒有外部同步的情況下從多個 goroutine 同時使用。
(這是一個不同的 SQLite 驅動程序,但此限制也適用于您的。)
使用 goroutine 時,必須使用單獨的數據庫連接。
默認情況下,SQLite 在遇到被另一個事務鎖定的數據庫時會立即中止。為了允許更多的并發,您可以通過設置繁忙超時來告訴它等待另一個事務完成。
使用BusyTimeout函數,如果你的 SQLite 驅動有它,或者直接執行PRAGMA busy_timeout SQL 命令。

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
請發布更多您的代碼,以便我們可以更全面地了解發生了什么。
但是,這里有一些想法。Golang 默認池數據庫連接(雖然,CENTOS 似乎可能不是......)。此外,您的程序正在“暫?!保驗樗诘却齺碜詳祿爝B接池的打開連接。如果您希望程序的其余部分在此期間繼續運行,您應該將其作為異步函數運行 -在此處查看goroutines。這將有效地導致您的程序按照您的需要排隊,因為連接將按照它們可用時請求的順序進行分配。如果您對內部結構感興趣,請在此處閱讀更多內容。
如果您需要一些關于 goroutine 外觀的代碼片段,請告訴我們。
- 2 回答
- 0 關注
- 472 瀏覽
添加回答
舉報
0/150
提交
取消