2013-01-09 62 views
3

sqlite可以在WAL模式下同時在同一個數據庫上執行多個事務嗎?在多線程中有多個事務的SQLite WAL模式

這裏是一個示例應用程序,它產生500個線程,每個線程創建一個新的sqlite連接。插入數據發生在一個事務中。

在此示例應用程序:


#include "sqlite3.h" 
#include "nspr\prthread.h" 

void CreateThreads(); 
static void StartThread(void *Arg); 

int main() 
{ 
    CreateThreads(); 
} 

void CreateThreads() 
{ 
    for(int i = 0; i<500;i++) 
    { 
     PR_CreateThread(PR_USER_THREAD, StartThread, NULL, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD, 0); 
    } 
    Sleep(10000); 
} 

void StartThread(void *Arg) 
{ 
    sqlite3 *sqlite; 
    char *errmsg; 
    const char *err; 
    const char *unused; 
    int ret; 
    const unsigned char * journal; 
    const char *dir = "D:\\Samples\\test.sqlite"; 
    ret = sqlite3_open(dir, &sqlite); 
    if(ret != SQLITE_OK) 
    { 
     err = sqlite3_errmsg(sqlite); 
     return; 
    } 

    char query[100]; 
    strcpy(query, "Begin transaction"); 
    if(sqlite3_exec(sqlite, query, NULL,0, &errmsg) != SQLITE_OK) 
    { 
     printf("%s", errmsg); 
     return; 
    } 

    strcpy(query, "insert into test values(1,2,3,4,5,6)"); 
    for(int i = 0; i<10;i++) 
    { 
     if(sqlite3_exec(sqlite, query, NULL,0, &errmsg) != SQLITE_OK) 
     { 
     printf("%s", errmsg); 
      return; 
     } 
    } 

    strcpy(query, "End Transaction"); 
    if(sqlite3_exec(sqlite, query, NULL,0, &errmsg) != SQLITE_OK) 
    { 
     printf("%s", errmsg); 
     return; 
    } 
    return; 
} 

我得到'數據庫已鎖定'運行此。

我的問題是用WAL模式我們可以同時有多個交易嗎?如果是這樣,我在示例應用程序中缺少什麼?

+0

樣,如果日誌模式設置爲WAL什麼? – Sandy

回答

6

無論如何,SQLite在其當前版本中不支持併發寫入。可以同時有多個閱讀器進程,但最多隻能有一個作者。 (見FAQ entry #5

隨着預寫日誌記錄啓用,這個事實不會改變WAL使更多的併發:。

WAL提供了作爲讀者不會阻止作家更多的併發,一個作家不會阻止閱讀器閱讀寫作可以同時進行

但不能寫併發:

作家只是追加新內容WAL文件的結尾。因爲作傢什麼都不會干擾讀者的行爲,所以作家和讀者可以同時運行。但是,由於只有一個WAL文件,因此時間只能有一個作者

(以上節選自the documentation on WAL。)