gpt4 book ai didi

c++ - MySQL select for update,多线程超时

转载 作者:行者123 更新时间:2023-11-28 01:34:03 29 4
gpt4 key购买 nike

我在 MySQL 数据库中有一个表,其中包含一些“准备好的”作业。

CREATE TABLE `ww_jobs_for_update` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`status` int(11) NOT NULL,
`inc` int(11) NOT NULL,
PRIMARY KEY (`id`)
)

现在我有一个 C++1y 多线程应用程序,其中每个线程都转到表并选择状态 = 0(未完成)的作业,进行一些计算并在完成时设置状态 = 1。

问题是许多线程将同时获取“作业行”,因此必须在数据库中进行一些锁定。

加锁/更新/提交的C++方法如下

connection = "borrow a connection from the pool"
std::unique_ptr<sql::Statement> statement(connection->sql_connection_->createStatement());
connection->sql_connection_->setAutoCommit(false);


//statement->execute("START TRANSACTION");
std::unique_ptr<sql::ResultSet> rs(statement->executeQuery("select id from ww_jobs_for_update where status=0 ORDER BY id LIMIT 1 FOR UPDATE"));


if (rs->next()) {

db_id = rs->getInt64(1);
DEBUG << "Unlock Fetched: " << db_id;
}

rs->close();

std::stringstream ss;
ss << "update ww_jobs_for_update set status=1 where id=" << db_id;


statement->execute(ss.str());
//statement->execute("COMMIT;");
connection->sql_connection_->commit();

"release the connection to the pool();"

但这种方法似乎效率不高。我总是回来

ErrorCode: 1205,SQLState: HY000. Details:

来自很多线程,尤其是当负载增加时。

为什么我要找回这个?执行此操作的最有效方法是什么,硬一致性是一项要求。

最佳答案

根据我的经验,完成此任务的最佳方法是使用 Redis 队列。锁定表 SELECT ... FOR UPDATE 会在您运行某些多线程应用程序等时挂起数据库。

我会建议你安装一个redis,并编写一些脚本来根据表中的数据创建队列,然后重写你的程序以使用redis队列来完成任务。Redis 队列不会为不同的线程提供相同的值,因此您可以获得唯一性并且数据库中没有锁 - 因此您的脚本可以快速运行。

关于c++ - MySQL select for update,多线程超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150887/

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