小巧、快速、可靠。
三者选其二。

SQLite C 接口

注册回调处理 SQLITE_BUSY 错误

int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);

sqlite3_busy_handler(D,X,P) 函数设置一个回调函数 X,该函数可能在尝试访问与 数据库连接 D 关联的数据库表时被调用,前提是另一个线程或进程已锁定该表。 sqlite3_busy_handler() 接口用于实现 sqlite3_busy_timeout()PRAGMA busy_timeout

如果忙回调为 NULL,则在遇到锁时立即返回 SQLITE_BUSY。如果忙回调不为 NULL,则可能会调用该回调,并传入两个参数。

忙处理程序的第一个参数是 sqlite3_busy_handler() 的第三个参数的 void* 指针的副本。忙处理程序回调的第二个参数是之前针对同一锁定事件调用忙处理程序的次数。如果忙回调返回 0,则不会再尝试访问数据库,并且 SQLITE_BUSY 将返回给应用程序。如果回调返回非零值,则会再次尝试访问数据库,并重复该循环。

忙处理程序的存在并不保证在发生锁争用时会调用它。如果 SQLite 确定调用忙处理程序可能会导致死锁,它将直接返回 SQLITE_BUSY 给应用程序,而不是调用忙处理程序。考虑这样一种情况:一个进程正在持有它试图提升为保留锁的读锁,而另一个进程正在持有它试图提升为独占锁的保留锁。第一个进程无法继续,因为它被第二个进程阻塞,而第二个进程也无法继续,因为它被第一个进程阻塞。如果两个进程都调用忙处理程序,那么两者都不会取得进展。因此,SQLite 为第一个进程返回 SQLITE_BUSY,希望这能促使第一个进程释放其读锁,并允许第二个进程继续执行。

默认的忙回调为 NULL。

每个 数据库连接 只能定义一个忙处理程序。设置新的忙处理程序将清除任何先前设置的处理程序。请注意,调用 sqlite3_busy_timeout() 或评估 PRAGMA busy_timeout=N 将更改忙处理程序,从而清除任何先前设置的忙处理程序。

忙回调不应执行任何修改调用忙处理程序的数据库连接的操作。换句话说,忙处理程序不是可重入的。任何此类操作会导致未定义的行为。

忙处理程序不能关闭调用忙处理程序的数据库连接或 预备语句

另请参见 对象常量函数 列表。