在WAL模式下,sqlite可以在同一个数据库上同时拥有多个事务吗?
这是一个示例应用程序,它生成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 :(得分:7)
启用了预写日志功能后,该事实不会发生变化。 WAL实现更多并发:
WAL提供更多的并发性,因为读者不会阻止编写者,而编写者不会阻止读者。阅读和写作可以同时进行。
但不要写并发:
作家只是将新内容附加到WAL文件的末尾。因为作家不会干扰读者的行为,所以作家和读者可以同时运行。但是,由于只有一个WAL文件,一次只能有一个编写器。
(以上摘自the documentation on WAL。)