База не видит записи пока не переподключишься

229
09 февраля 2018, 21:50

Есть у меня вот такая цепочка событий

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

Answer 1

У Вас запущена транзакция. В MyISAM транзакция по умолчанию запускается с уровнем изоляции REPEATABLE READ, т.е. "повторяющееся чтение". При первом чтении делается снапшот данных и все последующие чтения происходят из этого снимка. Чтобы увидеть в такой транзакции данные, закоммиченные другой транзакцией нужно транзакцию перезапустить (вызвав commit или rollback)

Второй путь - поставить уровень изоляции READ COMMITTED тогда Ваша транзакция будет видеть данные, закоммиченные другой транзакцией после обычной повторной выборки.

Поменять уровень изоляции транзакции можно командой

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

или установив параметр

transaction-isolation=READ-COMMITTED

в конфиге MySQL сервера.

Третий путь, пожалуй самый неправильный, установить режим автокоммита и уйти от транзакций вообще

Подробнее об уровнях изоляции здесь

READ ALSO
Подскажите пример проекта на Symfony4

Подскажите пример проекта на Symfony4

После отказа от бандлов каталоги Controller, Entity, Repository and etc находятся в srcЕсли нужно поделить проект на функционалы, то приходится создавать Controller/name,...

189
Не запускается скрипт php cron

Не запускается скрипт php cron

Не срабатывает php скрипт при выставлении задачи в кронеPhp скрипт:

194
Одностраничный сайт

Одностраничный сайт

Всем привет!

294