:!cat %| grep -c "pattern"
Это не точно команда энергии, но это даст Вам, в чем Вы нуждаетесь от энергии.
можно отобразить его на команду, если необходимо часто использовать его.
ЕСЛИ ваша реальная проблема больше, чем этот простой пример, вы должны использовать транзакцию в сочетании с таблицами блокировок, чтобы пользователи не перезаписывали друг друга.
Основные базы данных предназначены для обработки таких ситуаций.
При использовании MySQL механизм хранения InnoDB имеет функцию блокировки строк, которая блокирует строку, в которую выполняется запись. Таким образом, любой запрос на обновление той же строки будет ждать завершения предыдущей операции над строкой.
Если вы используете механизм хранения MyISAM, он блокирует всю таблицу при обновлении строки. Это создает блокировку на сервере, когда несколько игроков одновременно отправляют запросы на обновление. Так что все зависит от того, какую базу данных и, в частности, какой механизм хранения вы используете для этой цели.
Я согласен с ответом Xepochs, не вводите проблемы параллелизма, если в этом нет крайней необходимости. Отличный ответ о различных стратегиях блокировки см. здесь .
База данных управляет параллельной блокировкой и обеспечивает автоматическое внесение изменений. Это преимущество использования базы данных, которая поддерживает транзакции ACID .
В большинстве случаев изменения происходят достаточно быстро, так что конфликт за блокировку минимален. Но это все равно может произойти, поэтому вам необходимо проверить статус ошибки, возвращаемый после выполнения запроса SQL. Функция mysql_query ()
возвращает FALSE
, если есть проблема.
Затем вы можете выяснить причину (конфликт обновления, недостаточные права доступа, синтаксическая ошибка SQL и т. Д.), Вызвав mysql_errno ()
. См. http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html для справки по кодам ошибок MySQL.
Сохраните логику в БД, эта семантика в основном решена за вас.
update teams
set score = score + 1
where team_id = 1
.. или любой другой результат и любой номер команды.