gpt4 book ai didi

c - Sqlite3如何识别表锁定状态然后插入

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:42 24 4
gpt4 key购买 nike

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

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

有没有C,sqlite3的API机制,比如wait and then write into table until another threads is complete write operation.

感谢和问候。

-普拉文

最佳答案

有一种“共享缓存”模式,可以通过 C API 进行设置,如 here 所述.

Sqlite3 在最大化并发性方面做得很好,而且它也是线程安全的。查看File Locking and Concurrency document了解更多详情。

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

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

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

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

这是一篇有趣的文章,概述了一个问题 older versions of sqlite may sleep for a whole second当无法获取锁时。

关于c - Sqlite3如何识别表锁定状态然后插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17063385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com