@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
У вас уже был вопрос по этой теме, вам достаточно ясно ответили, что надо пользоваться мьютексами.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы