SQL: получить значение поля + инкремент

365
26 ноября 2016, 20:08

Здравствуйте!

Подскажите, пожалуйста, как мне получить значение folder2 в таблице и после этого сразу же инкрементировать это значение на +1. Важно, чтобы при большом количестве одновременных запросов полученные значения folder2 не повторялись.

+----+---------+--------+
| id | folder1 | folder2|
+----+---------+--------+
|  1 |  235    |  13    |
+----+---------+--------+

Запрос в php я бы сделал так:

   $sql_query1 = "SELECT folder2 from tbl_name";
   $sql_query2 = "UPDATE tbl_name SET folder2 = folder2 + 1"

Но, что если между $sql_query1 и sql_query2 пройдёт какое-то время, а другие пользователи также будут выполнять скрипт. Тогда у какого-то количества пользователей будет совпадение значений folder2.

Как этого можно избежать?

Спасибо!

Answer 1

Вам поможет блокировка таблиц:

$sql_query1 = "LOCK TABLE folder2 WRITE";
$sql_query2 = "SELECT folder2 from tbl_name";
$sql_query3 = "UPDATE tbl_name SET folder2 = folder2 + 1"
$sql_query4 = "UNLOCK TABLES";

В этом случае, даже если между query2 и query3 будет запущен SQL-запрос другим пользователем(подключением), он будет ждать, пока не будет снята блокировка пользователем(подключением), который её установил, запросом в query4.

Если таблица типа MyISAM - то можно поставить блокировку на строку, что будет менее затратно по ресурсам, но с этим вопросом вам лучше разобраться подробнее, прочитав про "Транзакции MyISAM".

READ ALSO
PHP: С MySql на Postgress [требует правки]

PHP: С MySql на Postgress [требует правки]

Столкнулся с задачей перенести за 1 вечер весь мой PHP код, что подключен к MySQL базе, на аналогичную базу Postgress и понял, что просто смена синтаксиса...

178
Организация календаря для квестов

Организация календаря для квестов

Как правильно можно организовать базу и сам код для календаря квестовИмеется несколько квестов

246
Сборка Qt5 из исходников на Linux

Сборка Qt5 из исходников на Linux

Имеется Ubuntu 1610 x64, необходимо создать статическую сборку Qt5 с MySQL для этой ОС

345