gpt4 book ai didi

c++ - 判断SQLite数据库是否被锁定

转载 作者:搜寻专家 更新时间:2023-10-30 23:26:00 24 4
gpt4 key购买 nike

我看了其他关于如何检测SQ​​Lite数据库是否被锁定的回答,建议使用sqlite3_busy_handler/sqlite3_busy_timeout。我正在使用支持 SQLite 数据库的 Qt,但这在这里并不重要。

因为在我的应用程序的用例中,另一个应用程序可能访问同一个数据库,所以我需要处理这种情况。

这是我在打开数据库时为数据库设置的选项:

auto db = QSqlDatabase::database();
db.setDatabaseName(m_sDatabasePath);
db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=0");
if (!db.open())
return false;

我有一个函数可以确定数据库是否被锁定:

int callback(void *data, int)
{
std::cout << "callback" << std::endl;
return 0;
}

bool isDatabaseLocked(const QSqlDatabase &db)
{
if (auto driver = db.driver())
{
// get driver handler
QVariant v = driver->handle();
if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0)
{
// v.data() returns a pointer to the handle
auto handle = *static_cast<sqlite3 **>(v.data());
if (handle)
{
std::cout << sqlite3_busy_handler(handle, callback, nullptr) << std::endl;
std::cout << sqlite3_busy_timeout(handle, 0) << std::endl;
}
}
}

return true;
}

当数据库被 lcoked 时,我执行这个函数并打印出两个 0 ( SQLITE_OK ),而我期望得到 5 ( SQLITE_BUSY )。回调函数也没有被调用。

我做错了什么?

最佳答案

正如文档中明确指出的那样,sqlite3_busy_handler 函数将回调函数设置为连接的繁忙处理程序。此类回调可能在遇到锁时被调用。在您的代码中,对 sqlite3_busy_handler 的调用返回 SQLITE_OK,这很好:这意味着尝试设置回调成功,没有理由返回 SQLITE_BUSY 此时,因为调用只影响连接,不影响数据库。

sqlite3_busy_timeout 函数也是如此,它反过来设置了一种不同类型的繁忙处理程序(顺便说一句,它取代了你刚刚设置的回调),它只是在指定的时间休眠直到释放锁为止的毫秒数。

现在,一般来说,如何检测资源是否被锁定?通常的做法是:尝试锁定

所以你可以使用这样的函数:

bool isDatabaseLocked(const QSqlDatabase & db)
{
QSqlQuery q(db);
if(q.exec("BEGIN EXCLUSIVE")) //tries to acquire the lock
{
q.exec("COMMIT"); //releases the lock immediately
return false; //db is not locked
}
return true; //failed to acquire the lock: returns true (db is locked)
}

要使其在无法获取锁时立即返回,请清除繁忙处理程序,将此连接的繁忙超时设置为零(在打开它之前):

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=0");

要测试该功能,请在数据库上打开一个命令行 sqlite3 session ,然后键入以下命令将其锁定:

sqlite> BEGIN EXCLUSIVE;

当你想释放锁时,输入即可

sqlite> COMMIT;

关于c++ - 判断SQLite数据库是否被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com