因此,我想从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;
}发布于 2015-06-26 03:43:42
“数据库锁定”消息通常在其他进程访问它时显示(用于删除或更新操作)。请参见此处的锁定机制详细信息:如果您拥有数据库的管理/根访问权限,则可以使用http://www.sqlite.org/lockingv3.html;如果您正在使用MySQL,则可以尝试
mysql>显示全过程;
这将显示所有当前进程、它们的SQL查询和状态的列表。现在,通常情况下,如果单个查询导致许多其他查询锁定,那么应该很容易识别。受影响的查询将处于锁定状态,而不正常的查询将独自等待,可能会等待一些密集的内容,比如临时表。
如果这并不明显,那么您将不得不使用您的SQL扣减能力来确定哪些违规SQL可能是您的问题的原因。
https://stackoverflow.com/questions/31064432
复制相似问题