SQLite之SQLITE_BUSY与sqlite3_busy_handler()

什么时候会返回SQLITE_BUSY错误码?官方文档给出的解释是:

The SQLITE_BUSY result code indicates that the database file could not be written (or in some cases read) because of concurrent activity by some other database connection, usually a database connection in a separate process.

这里所说的“数据库连接”实际上指的是用于sqlite3_open函数的sqlite3*结构体指针。也就是说,以下两种情况可能会返回SQLITE_BUSY错误码:

1、同一进程内的多个线程将不同的sqlite3*指针用于sqlite3_open()函数(即打开同一个数据库,但它们是不同的连接,因为sqlite3*指针各自不同),并向同一数据库执行写入操作。

2、不同的进程将不同的sqlite3*指针用于sqlite3_open()函数(即打开同一个数据库,但它们是不同的连接,因为sqlite3*指针各自不同),并向同一数据库执行写入操作。

而SQLite提供的sqlite3_busy_handler() API函数则为我们提供了一种处理SQLITE_BUSY错误码的机制。使用方法是在调用sqlite3_open()函数打开一个数据库连接后,调用sqlite3_busy_handler()注册一个数据库超时回调函数。该回调函数的原型必须类似于:

int busy_callback(void* lpVoid,int c)
{
	return nRet;
}

其中第一个参数为调用sqlite3_busy_handler()时传入的第三个参数的副本。

第二个参数为基于相同锁定事件的回调函数的前一次调用次数。例如,当第一次执行某个SQL语句时就

超时了,那么SQLite数据库引擎进入busy_callback回调函数时c为0,即第一次超时。如果第二次尝试还是超时,那

么SQLite数据库引擎进入busy_callback回调函数时c为1,依此类推。

而决定SQLite数据库引擎是否再次尝试执行超时的SQL语句是由回调函数的返回值来指定的。当nRet为非0时,SQLite

数据库引擎会等待获得锁,并再次尝试执行超时的SQL语句,直到执行完成。如果下一次尝试还是失败,并且nRet为

非0值,则SQLite数据库引擎不断重复上述过程,直到最终执行成功为止。但为了避免进入无限循环,我们可以配合

使用参数c,例如当尝试次数到达3次时就返回0值,表示放弃执行当前的SQL语句并不再重复尝试:

int busy_callback(void* lpVoid,int c)
{
    if(2==c)
    {
         return 0;
    }
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值