更新数据时,SQLite始终返回SQLITE_BUSY

时间:2015-06-26 03:32:22

标签: sqlite

所以,我想从name表更新字段account。 我的功能低于此功能。 但是当我测试它时,它无法正常工作。 sqlite3_step总是返回SQLITE_BUSY 我做了一个测试,得到了database is locked消息。 我该怎么办?

int c_accountdata::name_set(std::string input)
{
if (input.length() > 20)
{
    return -1;
}

sqlite3_bind_text(stmt_name_exist, 1, input.c_str(), -1, NULL);
if (sqlite3_step(stmt_name_exist) == SQLITE_ROW)
{
    sqlite3_reset(stmt_name_exist);
    return 0;
}
sqlite3_reset(stmt_name_exist);


sqlite3_bind_text(stmt_name_update, 0, input.c_str(), -1, NULL);
sqlite3_bind_text(stmt_name_update, 1, input.c_str(), -1, NULL);

int ret = sqlite3_step(stmt_name_update);

sqlite3_reset(stmt_name_update);

sampgdk::logprintf("%d", ret);

return 1;
}

1 个答案:

答案 0 :(得分:1)

“数据库已锁定”消息通常在某些其他进程访问它时显示(对于DELETE或UPDATE操作)。 请在此处查看锁定机制详细信息:http://www.sqlite.org/lockingv3.html 如果你有数据库的admin / root访问权限;如果你使用的是MySQL, 你可以试试

  

的MySQL>显示完整的过程列表;

这将显示所有当前进程,SQL查询和状态的列表。现在通常,如果单个查询导致许多其他查询锁定,那么它应该很容易识别。受影响的查询的状态为“已锁定”,违规查询将自行查找,可能正在等待密集的事情,如临时表。

如果不是很明显,那么你将不得不使用你的SQL推断能力来确定哪一部分违规的SQL可能是造成你的困境的原因。