2013-01-09 3 views
3

WAL 모드에서 sqlite가 동일한 데이터베이스에서 동시에 여러 트랜잭션을 처리 할 수 ​​있습니까?다중 스레드에서 다중 트랜잭션이있는 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

답변