sqlite的prepare/step和busy/lock

1、sqlite3_prepare_v2
     據<SQLite權威指南>P181,sqlite3_prepare_v2不會對數據庫或連接有任何影響,也不會啓動事務或獲取鎖。但是,在sqlite官方文檔的關於sqlite3_unlock_notify()的說明中提到,Although it is less common, a call to sqlite3_prepare() or sqlite3_prepare_v2() may also return SQLITE_LOCKED if it cannot obtain a read-lock on the sqlite_master table of each attached database. These APIs need to read the schema data contained in the sqlite_master table in order to compile SQL statements to sqlite3_stmt* objects.即,實際上是可能會遇到鎖的。而且,實際中已經碰到了。
2、sqlite3_step
  (1)用在寫時,按sqlite文檔的說法,如果開啓了IMMEDIATE事務成功後,step操作是不會發生busy的,測試也確實未發生,但在寫代碼時出於周全考慮還是加上busy的處理。
  (2)用在讀時,測試表明,無論在prepare之前是否開啓了事務(普通非IMMEDIATE),step操作可能會busy。

3、按照sqlite官方文檔裏的意思,busy是發生在不同數據庫連接間的,lock僅發生在同一個連接上,但經驗表明,從來沒遇見過busy,無論是讀、寫,無論是同一連接(多線程)還是不同連接,出現的總是lock.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章