2015-09-09 70 views
4

我在golang中使用sqlite3數據庫,我得到了錯誤:「數據庫被鎖定。」Sqlite3錯誤:數據庫被鎖定在golang

我知道不能有多個線程使用相同的數據庫文件。

儘管我的程序中只有一個連接,並關閉了所有查詢的結果,但它總是創建2或3個數據庫文件句柄。

我雲使用opendfileview程序檢查它。

任何人都可以幫助我解決這個問題。 在此先感謝。

以下代碼創建兩個數據庫文件句柄。

func main() { 
    database, tx, err := getDatabaseHandle() 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer database.Close() 
    dosomething(database, tx) 
} 
func dosomething(database *sql.DB, tx *sql.Tx) error { 
    rows, err := database.Query("select * from sometable where name=?","some") 
    if err != nil { 
     return err 
    } 
    if rows.Next() { 
     ... 
    } 
    rows.Close() 
    //some insert queries 
    tx.Commit() 
} 
func getDatabaseHandle() (*sql.DB, *sql.Tx, error) { 
    database, err := sql.Open("sqlite3", dbPath) 
    if err != nil { 
     fmt.Println("Failed to create the handle") 
     return nil, nil, err 
    } 
    if err2 := database.Ping(); err2 != nil { 
     fmt.Println("Failed to keep connection alive") 
     return nil, nil, err 
    } 
    tx, err := database.Begin() 
    if err != nil { 
     return nil, nil, err 
    } 
    return database, tx, nil 
} 
+1

你將不得不提供更多的信息,尤其是這表明你的問題的代碼。 – Volker

+0

你確定[其他沒有鎖定你的數據庫](http://stackoverflow.com/questions/151026/how-do-i-unlock-a-sqlite-database)? –

+0

在我的程序運行之前沒有數據庫文件句柄,但在我的程序運行後有2個句柄。所以我認爲只是我的程序本身鎖定了數據庫文件。 – superuser123

回答

10

嘗試defering的rows.Close()

if err != nil { 
    return err 
} 
defer rows.Close() 
if rows.Next() { 
    ... 
} 
+0

你點了。我通過關閉代碼中的所有「行」來解決我的問題。 雖然你的回答並不是我的問題的確切解決方案,但我會檢查你的答案。謝謝你的回答。 – superuser123

+0

很高興幫助! –

+1

非常好!非常感謝!我甚至沒有意識到你應該關閉數據庫處理程序以外的行;我認爲這將是'自動',但顯然不是。此外,_statements_也會發生同樣的問題;我使用的是https://godoc.org/github.com/mattn/go-sqlite3,使用後還有一個func來關閉語句。一旦我這樣做,可怕的'數據庫被鎖定'的錯誤消失了,給了我頭痛幾天! –

相關問題