【问题标题】:SQLite WAL mode with multiple transactions in multiple threadsSQLite WAL 模式在多个线程中具有多个事务
【发布时间】:2013-01-09 11:15:28
【问题描述】:

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;
}

我得到 'database is locked' 运行这个。

我的问题是在 WAL 模式下我们可以同时进行多笔交易吗?如果是这样,我在示例应用中缺少什么?

【问题讨论】:

  • 如果将日志模式设置为 WAL 会怎样?

标签: c sqlite


【解决方案1】:

无论如何,SQLite 在其当前版本中都不支持并发写入。可以同时有多个读取器进程,但最多只有一个写入器。 (见FAQ entry #5

启用预写日志记录后,这一事实不会改变。 WAL 支持更多并发:

WAL 提供了更多的并发性,因为读取器不会阻塞写入器,写入器不会阻塞读取器。读写可以同时进行。

但不写并发:

编写器只是将新内容附加到 WAL 文件的末尾。因为 writer 不会做任何会干扰 reader 动作的事情,所以 writer 和 reader 可以同时运行。但是,由于只有一个 WAL 文件,一次只能有一个写入器

(以上摘自the documentation on WAL。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多