Упрощенный псевдокод выглядит примерно так:
Поток 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);
Код: Выделить всё
$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.
Я использую Gearman в качестве очереди. Поток 1 запускается через Apache, а поток 2 просто запускается как отдельный процесс.
Редактировать 1:
Это происходит, когда поток 2 выполняется одновременно с потоком 1. По-видимому, он достигает некоторого состояния гонки с потоком 1, но я не могу понять, почему.
Редактировать 2:
Как отметил Н.Б., Innodb задерживает запись данных на диск, и, следовательно, они не видны второму потоку.
Как мне действовать в этом случае? Режим сна/сна почти всегда является неоптимальным решением, поскольку в условиях большой нагрузки время ввода-вывода диска может увеличиться. Есть ли какой-нибудь способ «уведомить» второй поток о том, что Innodb завершил дисковый ввод-вывод?
Подробнее здесь: https://stackoverflow.com/questions/970 ... nt-threads
Мобильная версия