- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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 模式我们可以同时进行多个交易吗?如果是这样,我在示例应用程序中缺少什么?
最佳答案
无论如何,SQLite 在其当前版本中不支持并发写入。可以同时有多个读取进程,但最多只有一个写入进程。 (参见 FAQ entry #5
启用预写日志记录后,这一事实不会改变。 WAL 支持更多并发:
WAL provides more concurrency as readers do not block writers and a writer does not block readers. Reading and writing can proceed concurrently.
但不写并发:
Writers merely append new content to the end of the WAL file. Because writers do nothing that would interfere with the actions of readers, writers and readers can run at the same time. However, since there is only one WAL file, there can only be one writer at a time.
(以上摘自 the documentation on WAL .)
关于c - 在多个线程中具有多个事务的 SQLite WAL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234007/
现状 所以我在运行 Postgres 的数据记录计算机上将 WAL 归档设置为独立的内部硬盘驱动器。包含 WAL 存档的硬盘驱动器已满,我想删除所有 WAL 存档文件并将其存档到外部备份驱动器,包括初
SQLite 文档说 ( here ) 您可以通过在单独的线程上运行检查点来避免 WAL 模式下的检查点暂停。我尝试了这个,但它似乎没有工作:'-wal' 文件无限增长,不清楚是否有任何东西实际上被复
请耐心等待 - 我将尝试在这个问题中使用正确的术语。我有一个 iOS 应用程序,多年来允许用户创建其 Core Data 支持的 .sqlite 数据库的备份。出于某种原因,很久以前,我将 Journ
我正在尝试将 Barman 配置为备份。当我执行 barman check replica 时,我不断得到: Server replica: WAL archive: FAILED (please m
所以,我一直在使用 MagicalRecord 开发 iPad 应用程序,最近在转移到自动迁移商店后我遇到了一些问题。我需要将我的 .db 文件从一个设备同步到另一个设备,所以我需要所有数据都在 .d
我是一名经验丰富的程序员,但这是我的第一个 MacOS 应用程序(在 10.15.2 上),它需要读取用户选择的 sqlite 数据库(可能在机器上的任何地方) 起初它不会自己打开数据库“name.s
我正在连续写入具有 PRAGMA journal_mode=WAL、PRAGMA journal_size_limit=0 的 db 文件。我的 C++ 程序有两个线程,一个读取器(每隔 15 秒查询
在 WAL 的原始文档中,清楚地说明了 FULL 和 NORMAL 同步之间的区别 1 : Write transactions are very fast since they only invol
我有一个应用程序的 apk,它与 Android 9 不兼容,因为它现在强制使用 WAL 而不是日志模式。有没有办法在不访问应用程序源代码的情况下禁用 WAL? 最佳答案 如果您无法控制应用程序的来源
在 postgresql 中,如何创建 WAL archieve?Backup 和 Restore 有分步说明使用 Linux 或 shell 命令? 环境: 操作系统:Linux RHEL 7.4
在流式复制中,是否有 WAL 传送优先级(现在或将来的版本)这样的概念,您可以在其中设置事务影响到达备用服务器的速度的优先级? 假设我要执行一个非关键更新,它会添加 2GB 的 WAL 文件。如果那
我一直在研究 Postgresql 中的崩溃恢复机制,这让我大吃一惊。在 WAL 日志记录中,在事务开始时,基于查询,WAL 缓冲区被 XLOG 记录填充。在事务提交时,WAL 缓冲区被刷新。现在,假
其实我正在使用WAL文件来设计一个复制工具,我需要知道是否有任何方法可以获取特定事务id(xid)中执行的sql语句 这是我在处理 pg_xlog 目录中的 WAL 文件时获得的信息 block ..
这或多或少是一个简单的是或否问题... 我可以同时将 PostgrSQL 配置为 WAL 到阿尔卑斯山某处的瑞士洞穴和本地 WAL 吗? 如果是,您能否设置一些软时间目标,即在将提交刷新到山中之前,可
使用 tarantool,为什么我要记录这些奇怪的消息: 2016-03-24 16:19:58.987 [5803] main/493623/http/XXX.XXX.XXX.XXX:57295 t
我想从 mac 应用导出我的 shazamed 标签。该应用程序不提供任何导出选项。Shazam for Mac 将它们存储在 sqlite 3 数据库中。 该应用正在生成 3 个文件: Shazam
我有以下代码 int main(){ sqlite3 *db; int rc; char filename[512]; char query[512]; char trace_string[5
WAL(Write-Ahead Log)技术已经在很多系统中使用。 WAL 的机制是,当客户端写入数据时,系统会做两件事: 写个 日志到磁盘并返回给客户端 写下 数据异步到磁盘、缓存或内存 有两个好处
我是 Hawk model indexing 的开发者之一工具。我们的工具将 XMI 模型索引到图表中,以加快后续查询的速度,并且需要在“批量插入”和“事务更新”模式之间来回切换。当我们第一次注意到目
我想知道是否有一种方法可以更简单地从 WAL 日志中读取事务。我想要交易而不是二进制数据。我使用了 pg_xlogdump 但我不知道如何从看起来像这样的结果中获取交易 rmgr: Btree
我是一名优秀的程序员,十分优秀!