iphone開發中,多線程下sqlite鎖定的問題

來源:互聯網
上載者:User

資料轉自:

http://blog.csdn.net/yifanernei/article/details/5642127 

SQLite 支援三種線程模式:
1. 單線程模式  SQLITE_CONFIG_SINGLETHREAD
    這種模式下,沒有進行互斥,多線程使用不安全
2. 多線程模式  SQLITE_CONFIG_MULTITHREAD
    這種模式下,在多線程中使用單個資料庫連接是不安全的,否則就是安全的。(譯註:即不能在多個線程中共用資料庫串連)
3. 串列模式  SQLITE_CONFIG_SERIALIZED
    這種模式下,sqlite是安全執行緒的。(譯註:即使在多個線程中不加互斥的使用同一個資料庫連接)

運行時選擇線程模式
    如果沒有在編譯時間和啟動時指定為單線程模式,那麼每個資料庫連接在建立時可單獨的被指定為多線程模式或者串列模式,但是不能指定為單線程模式。如果在編譯時間或啟動時指定為單線程模式,就無法在建立串連時指定多線程或者串列模式。
   

建立串連時用sqlite3_open_v2()函數的第三個參數來指定線程模式。SQLITE_OPEN_NOMUTEX標識建立多線程模式的連
接;SQLITE_OPEN_FULLMUTEX標識建立串列模式的串連。如果沒有指定標識,或者使用sqlite3_open()或
sqlite3_open16()函數來建立資料庫連接,那麼在編譯時間或啟動時指定的線程模式將作為預設的線程模式使用。


再iphone中, 啟動時候 書寫代碼:

    sqlite3_config(SQLITE_CONFIG_SERIALIZED);  //這句話沒有起到該有的效果   //.....

應可以保證資料一致性問題. 

 


   // sqlite3_config(SQLITE_CONFIG_SERIALIZED);
   // sqlite3_exec(database,"PRAGMA cache_size = 8000;",NULL,NULL,NULL);
    //sqlite3_exec(database,"pragma synchronous = OFF",NULL,NULL,NULL);
    sqlite3_busy_timeout(database, 500);  //這句代碼生效,和使用線程鎖一個效果...

現在的方案,線程鎖和代碼一起使用. 

目前資料庫操作部分沒有用單例.即每次讀取都會去串連資料庫.使用單例的效果應該是一樣的..

持續學習ing

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.