SQLite C 接口

注册回调以处理 SQLITE_BUSY 错误

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

sqlite3_busy_handler(D,X,P) 例程设置了一个回调函数 X,当另一个线程或进程锁定了与数据库连接D 关联的数据库表时,每当尝试访问与数据库连接 D 关联的数据库表时,都可以使用参数 P 调用该回调函数 。sqlite3_busy_handler() 接口用于实现 sqlite3_busy_timeout()PRAGMA busy_timeout

如果忙回调为 NULL,则 在遇到锁时立即返回SQLITE_BUSY 。如果忙回调不为 NULL,则可以使用两个参数调用回调。

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

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

默认忙回调为 NULL。

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

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

繁忙的处理程序不得关闭调用繁忙处理程序 的数据库连接或准备好的语句。

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