2014-01-18 126 views
2

我正在使用sqlite項目。在我的項目中,我正在插入,獲取和更新數據到datbase.But有時我是數據庫的geeting錯誤被鎖定,並且沒有這樣的表:tablename。我檢查了我的代碼sqlite3_open,sqlite3_prepare_v2,sqlite3_step,sqlite3_finalize和sqlite3_close。但我得到Problem.Can任何人都可以幫助我數據庫已鎖定錯誤sqlite Ios

回答

2

當您嘗試從同一數據庫連接同時與數據庫執行兩個不兼容的事情時,會出現此錯誤代碼。例如,如果您處於SELECT語句的中間,並且您嘗試刪除SELECT所讀取的其中一個表,您將收到SQLITE_LOCKED錯誤。下面是(使用的Tcl)的示例:

db eval {SELECT rowid FROM ex1} { 
    if {$rowid==10} { 
    db eval {DROP TABLE ex1} ;# will give SQLITE_LOCKED error 
    } 
} 

注意,一個SQLITE_LOCKED錯誤是從SQLITE_BUSY不同(5)。 SQLITE_BUSY意味着另一個數據庫連接(可能在另一個進程中)以阻止您使用數據庫的方式使用數據庫。 SQLITE_LOCKED意味着爭用的來源是內部的,並且來自收到SQLITE_LOCKED錯誤的同一數據庫連接。

這裏有其他原因得到一個SQLITE_LOCKED錯誤:

  1. 試圖創建或刪除表或索引,而SELECT語句是 仍懸而未決。

    • 有時人們認爲他們已經使用SELECT語句 因爲sqlite3_step()返回SQLITE_DONE完成。但是,在sqlite3_reset()或sqlite3_finalize()調用 之前,SELECT是 並不真正完成。

    • 從簽入[3902](2007-05-02 V3.3.17之後)開始,現在允許使用CREATE語句 。

  2. 試圖寫入一個表而SELECT是在該相同 表活性。

    • 從簽入[3355](2006-08-16版本3.3.7之後)開始,現在允許使用 。
  3. 試圖做兩SELECT在同一個表在同一時間在
    多線程應用程序,如果SQLite是沒有設置這樣做。

  4. 的fcntl(3,在DB文件F_SETLK調用失敗,這可能是由
    NFS鎖定問題引起的,例如,對於這個問題的一個解決方案,就是 MV的DB走,並把它複製回來,它有一個新的inode
    值。

+0

你有problem.All參考的任何解決方案都歡迎。 – chakshu

相關問題