gpt4 book ai didi

mysql - 使用 perl 处理数据 - 选择使用 mysql 进行更新

转载 作者:行者123 更新时间:2023-11-29 00:52:30 25 4
gpt4 key购买 nike

我有一个表存储需要处理的数据。我在表中有 ID、状态和数据。我目前正在浏览并选择 id,其中 status = # 的数据。然后我在选择后立即进行更新,更改状态 # 以便它不会被再次选择。

我的程序是多线程的,有时我会得到获取相同 ID 的线程,因为它们都在彼此相对接近的时间查询表,从而导致获取相同的 ID。我查看了 select for update,但是,我的查询有误,或者我不明白它的用途。

我的目标是找到一种获取 id、我需要的数据并设置状态的方法,这样其他线程就不会尝试获取和处理相同的数据。这是我试过的代码。 (我把它们全部写在这里是为了展示目的。我在程序开始时就准备好了,每次运行时都不做准备,以防万一有人担心)

  my $select = $db->prepare("SELECT id, data FROM `TestTable` WHERE _status=4 LIMIT ? FOR UPDATE") or die $DBI::errstr;
if ($select->execute($limit))
{
while ($data = $select->fetchrow_hashref())
{

my $update_status = $db->prepare( "UPDATE `TestTable` SET _status = ?, data = ? WHERE _id=?");
$update_status->execute(10, "", $data->{_id});
push(@array_hash, $data);

}
}

当我运行它时,如果执行多个线程,当我在处理我的交易数据后尝试执行插入时,我会得到很多重复的插入。

我对 mysql 和我所做的研究不是很熟悉,我还没有找到任何能真正为我解决这个问题的东西。

谢谢

最佳答案

作为完整性检查,您使用的是 InnoDB 吗? MyISAM 具有零事务支持,除了通过全表锁定来伪造它。

我看不到您从哪里开始交易。 MySQL 的 autocommit 选项在默认情况下处于启用状态,因此除非您关闭 autocommit,否则启动事务和稍后提交是必要的。

关于mysql - 使用 perl 处理数据 - 选择使用 mysql 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786755/

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