@websiller

Как установить монопольную транзакцию в mysql?

Небольшой пример, не реальная ситуация, а просто для понимания задачи:

Файл test1.php
mysqli_query($connect, 'START TRANSACTION');
mysqli_query($connect, 'SELECT @var:=value FROM userinfo WHERE id=1');
sleep(10);
mysqli_query($connect, 'UPDATE userinfo SET value=@var + 1 WHERE id=1');
mysqli_query($connect, 'COMMIT');

Файл test2.php
mysqli_query($connect, 'START TRANSACTION');
mysqli_query($connect, 'SELECT @var:=value FROM userinfo WHERE id=1');
mysqli_query($connect, 'UPDATE userinfo SET value=@var + 1 WHERE id=1');
mysqli_query($connect, 'COMMIT');

Есть две транзакции. Суть в том что они должны прочитать значение поля (value), увеличить его на 1 и записать результат обратно в это поле. Проблема в том, что эти транзакции не блокируют друг друга, а выполняются параллельно. В первом файле (test1.php) между чтением и записью значения есть функция sleep(10), которая заставляет программу ждать 10 секунд, перед выполнение следующих операций. Если сначало запустить файл test1.php, а потом сразу запустить test2.php, то в результате поле value увеличиться лишь на единицу. Это логично, ведь первый файл сначало прочитает значение и потом заснет на 10 сек, в то время как второй файл также прочитает это значение и сразу же увеличит его на 1. Спустя 10 сек. 'проснется' первый файл, который знает только старое значение и ничего не знает о новом. Увеличит его на 1 и обновит данные. То есть в итоге выполнения обоих файлов значеие увеличиться на 1, а не на 2. Мне же нужно, чтобы транзакции выполнялись поочередно. То есть пока не выполниться первая, вторая не сможет получить доступ к строкам испольемым в первой транзакции. Как можно изменить стандартное поведение, чтобы транзакции выполнялись последовательно одна за другой. Уровень изолированости транзакции изменить не могу (хостер не разрешает). Да и проблему это бы не решило, так как даже при уровне SERIALIZABLE второй файл тупо выдаст ошибку что записи заняты и прекратит свое выпонение, а не встанет в очередь, как мне нужно.
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 1
bitver
@bitver
У вас уже был вопрос по этой теме, вам достаточно ясно ответили, что надо пользоваться мьютексами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы