@dvomaks

Как правильно сделать блокироку таблици или строки?

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

Собственно наверное проще будет объяснить на примере. Если делать всё по простому то получится два запроса:
<?
$result = mysql_query("SELECT value FROM my_table ORDER BY id DESC LIMIT 1");
$row = mysql_fetch_assoc($result);
$value = $row['value']+1; 

$query = mysql_query("INSERT INTO my_table (value) VALUES ('$value')");


Но может возникнуть ситуация когда после выполнения первого запроса произошла вставка спровоцированная другим пользователем и данные в переменной $value уже будут устаревшими. Пока вижу только вариант с блокированием на чтение и запись всей таблицы.

Может есть более элегантное решение данной проблемы?
Возможно я не доконца понял логику работы транзаций в MySQL и можно воспользоваться этим инструментом?
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 4
bigton
@bigton
Web-программист
Добавление полю AUTO_INCREMENT не решит вашу проблему?
Ответ написан
@entermix
Как то так попробуйте:
INSERT INTO my_table (value) VALUES ((SELECT value FROM my_table ORDER BY id DESC LIMIT 1))
Ответ написан
@Niomin
Во-первых, стоит использовать mysqli (mysql deprecated, начиная с 5.5).
Во-вторых, может, PDO? :)
Но, если ограничиться вашим примером, то да, блокировать таблицу придётся целиком.
Начало транзакции
Блокировка через SELECT
Ответ написан
streetflush
@streetflush
Делают костыли, с резервированием строки под новую запись с дефолтным значением, которое проверяется остальными запросами (например, когда необходимо избежать дедлока).
Insert into table ('wait for logic')
ScopeIdentity
...
Update table where id=scopeidentity

Но если блокировка одна, то она предпочтительней.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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