Как сделать один запрос вне зависимости от количества переходов?

У меня есть такой код:

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)
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
if ($user_damage > $battle['health']) {
    // Установка блокировки на таблицу `_basement_battle`
    mysql_query('LOCK TABLES `_basement_battle` WRITE');

    try {
        mysql_query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
        mysql_query('START TRANSACTION');

        // Выполнение обновлений
        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');
    } finally {
        // Снятие блокировки после выполнения транзакции
        mysql_query('UNLOCK TABLES');
    }
}
Ответ написан
Ваш ответ на вопрос

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

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