Есть у меня вот такая цепочка событий
function foo()
{
// делаю запрос на сторонний сервер, который делает запрос обратно на мой и записывает результат в базу
$this->sendRequest('http://api.god/make-awesome');
// проверяю наличие вновь созданной записи, но её нет. Но на самом деле она уже есть
$res = $this->db->query('SELECT EXISTS(SELECT * FROM `awesome` WHERE `maked` IS NULL')); // $res = false
// а если сделать так, т.е. переподключиться к базе, то всё находит
$this->db->close();
$this->db->open();
$res = $this->db->query('SELECT EXISTS(SELECT * FROM `awesome` WHERE `maked` IS NULL')); // $res = true
}
Не пойму как заставить PHP видеть изменения в базе, сделанные параллельно другим процессом? Возможно ли это?
Ответ крылся в транзакции, на что любезно указал @AntonShchyrov
У Вас запущена транзакция. В MyISAM транзакция по умолчанию запускается с уровнем изоляции REPEATABLE READ, т.е. "повторяющееся чтение". При первом чтении делается снапшот данных и все последующие чтения происходят из этого снимка. Чтобы увидеть в такой транзакции данные, закоммиченные другой транзакцией нужно транзакцию перезапустить (вызвав commit или rollback)
Второй путь - поставить уровень изоляции READ COMMITTED тогда Ваша транзакция будет видеть данные, закоммиченные другой транзакцией после обычной повторной выборки.
Поменять уровень изоляции транзакции можно командой
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
или установив параметр
transaction-isolation=READ-COMMITTED
в конфиге MySQL сервера.
Третий путь, пожалуй самый неправильный, установить режим автокоммита и уйти от транзакций вообще
Подробнее об уровнях изоляции здесь
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости