Есть у меня вот такая цепочка событий
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 сервера.
Третий путь, пожалуй самый неправильный, установить режим автокоммита и уйти от транзакций вообще
Подробнее об уровнях изоляции здесь
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
После отказа от бандлов каталоги Controller, Entity, Repository and etc находятся в srcЕсли нужно поделить проект на функционалы, то приходится создавать Controller/name,...
Не срабатывает php скрипт при выставлении задачи в кронеPhp скрипт: