если да то как
Спустя 11 минут, 51 секунда (21.12.2009 - 21:22) twin написал(а):
Нет. Чем базы и хороши, что позволяют не думать о таких казусах.
Спустя 29 минут, 22 секунды (21.12.2009 - 21:52) glock18 написал(а):
Блокировать можно. mysql имеет варианты блокировки, и сам их использует. другое дело, что для innodb доступно два варианта: row lock и table lock. Сам mysql использует в основном row lock, потому что он как правило предпочтительней. При желании можно показать ему, что нужно использовать table lock. Вдобавок таблицы можно лочить аналогично обычным файлам в фс.
Спустя 27 минут, 46 секунд (21.12.2009 - 22:20) VolCh написал(а):
Обычно необходимость блокировки обходится выносом логики в SQL запрос. Например, вместо кода (условно)
который без блокировки небезопасен, так как между SELECT и UPDATE может пройти другой запрос на изменение cnt в строке с id 1, можно использовать
Но если тебе нужно не только увеличить значение cnt, но и получить его в скрипт (например для вывода) и критично, что получить надо именно то, что записал, то без блокировок не обойтись.
$row=query('SELECT cnt FROM table WHERE id = 1');
query('UPDATE table SET cnt = ' . $row['cnt']+1)
который без блокировки небезопасен, так как между SELECT и UPDATE может пройти другой запрос на изменение cnt в строке с id 1, можно использовать
query('UPDATE table SET cnt = cnt +1 WHERE id=1')
Но если тебе нужно не только увеличить значение cnt, но и получить его в скрипт (например для вывода) и критично, что получить надо именно то, что записал, то без блокировок не обойтись.
Спустя 14 минут, 42 секунды (21.12.2009 - 22:34) sergeiss написал(а):
Цитата (VolCh @ 21.12.2009 - 23:20) |
Но если тебе нужно не только увеличить значение cnt, но и получить его в скрипт (например для вывода) и критично, что получить надо именно то, что записал, то без блокировок не обойтись. |
Небольшое примечание.
В Постгре это делается добавкой в конце запроса 2-х слов:
update ...тут_все_данные... returning *
Спустя 5 минут, 2 секунды (21.12.2009 - 22:39) glock18 написал(а):
Да, классная фича у постгре это. Но у мускуля тоже варианты есть, как получить данные из запроса update