0

我在fedora linux中使用sqlite3 3.6.23.1版本。我有两个线程正在运行来访问数据库。两个线程有​​可能会尝试在同一个表中执行写操作。

当第一个线程执行写操作时,表被锁定。我该如何处理这种情况。

是否有任何 C,sqlite3 API 机制,例如等待然后写入表,直到另一个线程完成写入操作。

感谢和问候。

-普拉文

4

1 回答 1

1

有一种“共享缓存”模式,可以通过 C API 设置,如此处所述

Sqlite3 在最大化并发方面做得很好,它也是线程安全的。有关详细信息,请参阅文件锁定和并发文档

该表确实在写入操作期间被锁定,但是 sqlite3 能够通过等待锁定被释放然后将锁定授予想要执行写入(或读取)的第二个进程/线程来导航这种情况)。等待锁的超时时间可以在你的 sqlite 连接代码中配置。这是 Python 2.7 的语法:

sqlite3.connect(database[, timeout, detect_types, isolation_level, 
                check_same_thread, factory, cached_statements])

默认超时为 5.0 秒。因此,需要相当庞大的 SELECT 或 COMMIT 事务才能在这段时间内保持锁定。但是,根据您的用例,您可以调整超时或包含代码以捕获超时异常。

最后一个选择是在你的代码中加入某种标记机制,要求竞争线程在尝试访问数据库之前等待标志清除,但这重复了 sqlite3 开发人员的努力,他们将并发场景作为主要服务他们工作的一部分。

这是一篇有趣的文章,概述了旧版本的 sqlite在无法获取锁时可能会休眠一秒钟的问题。

于 2013-06-17T08:36:54.180 回答