所以,我想从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;
}
答案 0 :(得分:1)
“数据库已锁定”消息通常在某些其他进程访问它时显示(对于DELETE或UPDATE操作)。 请在此处查看锁定机制详细信息:http://www.sqlite.org/lockingv3.html 如果你有数据库的admin / root访问权限;如果你使用的是MySQL, 你可以试试
的MySQL>显示完整的过程列表;
这将显示所有当前进程,SQL查询和状态的列表。现在通常,如果单个查询导致许多其他查询锁定,那么它应该很容易识别。受影响的查询的状态为“已锁定”,违规查询将自行查找,可能正在等待密集的事情,如临时表。
如果不是很明显,那么你将不得不使用你的SQL推断能力来确定哪一部分违规的SQL可能是造成你的困境的原因。