首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Register A Callback To Handle SQLITE_BUSY Errors

代码语言:javascript
复制
int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);

sqlite3_busy_handler(D,S,P)例程设置一个回调函数X,当另一个线程或进程锁定表时,每当尝试访问与数据库连接D相关的数据库表时,都可以调用该参数。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将更改繁忙处理程序,从而清除以前设置的繁忙处理程序。

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

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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com