Способ 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, у нас могут быть многократные сделки в то же время? Если так, что я пропускаю в типовом приложении?

3
добавлено
Просмотры: 2
nl ja de
что относительно того, если способ журнала установлен в WAL?
добавлено автор Sandy, источник

1 ответы

SQLite, in its current versions anyway, does not support concurrent writes. There can be multiple reader processes simultaneously, but at most one writer. (See FAQ entry #5

С позволенной Регистрацией Написания Вперед не изменяется тот факт. WAL позволяет больше параллелизма:

WAL обеспечивает больше параллелизма, поскольку читатели не блокируют писателей, и писатель не блокирует читателей. Чтение и письмо могут продолжиться одновременно.

Но не пишут параллелизм:

Писатели просто прилагают новое содержание до конца файла WAL. Поскольку писатели не делают ничего, что вмешалось бы в действия читателей, писатели и читатели могут бежать в то же время. Однако с тех пор есть только один файл WAL, может только быть один писатель за один раз </силен>.

(Выше выдержек из документация относительно WAL.)

6
добавлено