Абсурдное поведение MySQL с одним и тем же набором данных, но с разными потокамиPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Абсурдное поведение MySQL с одним и тем же набором данных, но с разными потоками

Сообщение Anonymous »

Я подключаюсь к базе данных MySQL из двух разных экземпляров PHP. Первый поток добавляет новую строку, передает идентификатор новой строки второму потоку через очередь. Иногда второй поток не может найти данные новой строки, хотя теоретически они должны попасть в базу данных после того, как первые потоки завершат свою работу.

Упрощенный псевдокод выглядит примерно так:

Поток 1

Код: Выделить всё

$db = get_mysql_connection();
$db->beginTransaction();
$rowid = $db->query("insert data..");
$db->commit();

//For Debugging purposes only
$db->check_if_row_exists($rowid); //Always returns true

send_to_queue($rowid);
Тема 2

Код: Выделить всё

$rowid = fetch_from_queue();
$db = get_mysql_connection();
$db->check_if_row_exists($rowid); //Sometimes returns false;
usleep(1000000);
$db->check_if_row_exists($rowid); //Always returns true.
Я не могу понять, почему поток 1 показывает, что данные имеют действительную запись, а поток 2, который определенно делает запрос когда-то после потока 1, не может найти данные. Я использую транзакции для фиксации данных, это делает что-то странное?

Я использую Gearman в качестве очереди. Поток 1 запускается через Apache, а поток 2 просто запускается как отдельный процесс.

Редактировать 1:
Это происходит, когда поток 2 выполняется одновременно с потоком 1. По-видимому, он достигает некоторого состояния гонки с потоком 1, но я не могу понять, почему.

Редактировать 2:
Как отметил Н.Б., Innodb задерживает запись данных на диск, и, следовательно, они не видны второму потоку.

Как мне действовать в этом случае? Режим сна/сна почти всегда является неоптимальным решением, поскольку в условиях большой нагрузки время ввода-вывода диска может увеличиться. Есть ли какой-нибудь способ «уведомить» второй поток о том, что Innodb завершил дисковый ввод-вывод?

Подробнее здесь: https://stackoverflow.com/questions/970 ... nt-threads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»