У меня есть такой код:
if ( $user_damage > $battle['health'] ) {
mysql_query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
mysql_query('START TRANSACTION');
try {
mysql_query('UPDATE `basement_clans` SET `json_key` = JSON_SET(`json_key`, \'$."' . 'key_'.($battle['boss_id'] + 1) . '"\', JSON_EXTRACT(`json_key`, \'$."' . 'key_'.($battle['boss_id'] + 1) . '"\') + 1), `json_limit` = JSON_SET(`json_limit`, \'$."' . 'boss_'.$battle['boss_id'] . '"\', JSON_EXTRACT(`json_limit`, \'$."' . 'boss_'.$battle['boss_id'] . '"\') + 1), `json_medals` = JSON_SET(`json_medals`, \'$."' . 'boss_'.$battle['boss_id'] . '"\', JSON_EXTRACT(`json_medals`, \'$."' . 'boss_'.$battle['boss_id'] . '"\') + 1) WHERE `clan` = '.$clan['id'].' AND `jail` = '.$user['reset']);
mysql_query('DELETE FROM `_basement_battle` WHERE `id` = '.$battle['id']);
mysql_query('COMMIT');
} catch (Exception $e) {
mysql_query('ROLLBACK');
}
}
проблема: когда одновременно бьют несколько пользователей или более, то засчитывает столько сколько было одновременных ударов
нужно: чтобы был один запрос вне зависимости от того, сколько было этих одновременных ударов
использовала: мемкеш, блокировку запросов, атомарные операции, циклы
ничего не помогает
есть 3 таблицы:
basement_clans (id, clan, json_key, json_limit, json_medals, jail) -- С откуда берутся ключи (с которыми и проблема) ($clanData)
_basement_battle (id, clan_id, boss_id, health, jail, time) -- Само сражение ($battle)
_basement_member (id, user_id, user_health, fight_id, clan_id, boss_id, damage, jail) -- Участники сражения (fight_id -> id) ($member)