gpt4 book ai didi

c++ - `sqlite3` 忽略 `sqlite3_busy_timeout` 吗?

转载 作者:行者123 更新时间:2023-12-02 10:59:31 30 4
gpt4 key购买 nike

我在多线程应用程序中使用sqlite3(它是用SQLITE_THREADSAFE=2编译的)。在监 window 口中,我看到 sqlite->busyTimeout == 600000,即。 e.应该有 10 分钟的超时时间。然而,sqlite3_step 返回 SQLITE_BUSY 显然比 10 分钟后要快(它实际上立即返回,就像我从未调用 sqlite3_busy_timeout 一样)。sqlite3忽略超时并立即返回错误的原因是什么?

最佳答案

一种可能性:SQLite 在检测到死锁时忽略超时。

场景如下。事务A作为读取器启动,随后尝试执行写入。事务B是一个写入者(要么以这种方式开始,要么作为读取者开始并首先提升为写入者)。 B 持有一个 RESERVED 锁,等待读取器清除以便开始写入。 A 持有 SHARED 锁(它是读取器)并尝试获取 RESERVED 锁(以便它可以开始写入)。各种锁类型的说明参见 http://sqlite.org/lockingv3.html

在这种情况下取​​得进展的唯一方法是回滚其中一个事务。再多的等待也无济于事,因此当 SQLite 检测到这种情况时,它不会遵守繁忙超时。

有两种方法可以避免死锁的可能性:

  1. 切换到WAL mode - 它允许一位作者与多个读者共存。
  2. 使用BEGIN IMMEDIATE来启动最终可能需要写入的事务 - 这样,它会立即作为写入器启动。这当然会降低系统中潜在的并发性,这是避免死锁的代价。

关于c++ - `sqlite3` 忽略 `sqlite3_busy_timeout` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30438595/

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