У меня есть таблица, в которой хранятся данные, которые необходимо обработать.У меня есть идентификатор, статус, данные в таблице.Я сейчас прохожу и выбираю идентификатор, данные, где статус = #.Затем я делаю обновление сразу после выбора, меняя статус #, чтобы он больше не выбирался.
моя программа многопоточная, и иногда я получаю потоки, которые получают тот же идентификатор, что и они обазапросы к таблице в относительно близкое время друг к другу, вызывая захват одного и того же идентификатора.Я посмотрел в выбор для обновления, однако, я либо сделал запрос неправильно, или я не понимаю, для чего он используется.
Моя цель - найти способ получения идентификатора, данных, которые мне нужныи установка статуса так, чтобы никакой другой поток не пытался получить и обработать те же данные.вот код, который я попробовал.(Я написал все это вместе с целью показа здесь. У меня есть мои приготовления, подготовленные в начале программы, чтобы не готовить каждый раз, когда она запускается, на случай, если кто-то там заинтересовался)
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 и проведенным мною исследованием. Я не нашел ничего, что действительно прояснило бы это для меня.
спасибо