您的位置:首页 > 博客中心 > 数据库 >

sqlite3之sqlite3_busy_handler使用详解

时间:2022-03-10 17:51

int callback_db(void *ptr,int count) { usleep(500000); //如果获取不到锁,等待0.5秒 printf("database is locak now,can not write/read.\n"); //每次执行一次回调函数打印一次该信息 return 1; //回调函数返回值为1,则将不断尝试操作数据库。 } 参数int count为回调函数执行次数,在此处对count值无需要,所以没有进行打印等操作。

char *zErrMsg = 0; int rc; char *sql; int nrow = 0; int ncolumn = 0; char ** azResult; rc = sqlite3_open("MOADB", &db); if( rc ) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } sql="select xxxxxx from database"; <span style="white-space:pre"> </span>sqlite3_busy_handler(db,callback_db,(void *)db); //一直等待,直到获得锁 sqlite3_get_table(db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); sqlite3_close(db); sqlite3_busy_handler中第三个参数为(void *)db,此参数会传给callback回调函数的第一个参数。

程序运行过程中,如果有其他进程或者线程在读写数据库,那么sqlite3_busy_handler会不断调用回调函数,直到其他进程或者线程释放锁。获得锁之后,不会再调用回调函数,从而向下执行,进行数据库select操作。该函数是在获取不到锁的时候,以执行回调函数的次数来进行延迟,等待其他进程或者线程操作数据库结束,从而获得锁操作数据库。


sqlite3之sqlite3_busy_handler使用详解,布布扣,bubuko.com

热门排行

今日推荐

热门手游