Small. Fast. Reliable.
Choose any three.

SQLite C接口

注册回调以处理SQLITE_BUSY错误

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

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

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

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

繁忙的处理程序的存在并不能保证在存在锁争用时将调用该处理程序。如果SQLite确定调用繁忙处理程序可能导致死锁,它将继续执行并将SQLITE_BUSY返回 给应用程序,而不是调用繁忙处理程序。考虑一个方案,其中一个进程持有试图将其提升为保留锁的读取锁,而第二个进程持有试图将其提升为排他锁的保留锁。第一个进程无法进行,因为它被第二个进程阻止了,第二个进程无法进行,因为它被第一个进程阻止了。如果两个进程都调用繁忙的处理程序,则两者都不会取得任何进展。因此,SQLite返回SQLITE_BUSY 对于第一个进程,希望这将导致第一个进程释放其读取锁定并允许第二个进程继续进行。

默认的忙回叫为NULL。

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

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

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

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