Проблема с MySQL R7
#1

После перехода с версии R6 на R7, которые, как всем известно, отличаются поточностью, возникла проблема с сохранением данных аккаунтов. Дело в том, что аккаунту, могут записаться чужие данные (в момент выхода игрока с сервера).

Полезная информация:
Возникает это чаще всего при большом онлайне на сервере.
Функция сохранения разбита на 4 запроса к базе.
На R6 такого не было.
Данные аккаунта сохраняются в базу только при отключение игрока с сервера.

Кто встречался с этим? Как решили?
Reply
#2

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

При загрузке такой проблемы не обнаружено.
Reply
#3

вероятно запросы кривые у вас.
Reply
#4

запросы прямее нету.
если бы они были кривые то не работало во всех случаях.
А речь идёт про редкие случаи сбоя работы.
Reply
#5

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
проблема у меня такая же.
Решения ещё не нашёл.
Причина я думаю, в том что данные не успевают сохраниться, как по циклу приходит новая операция сохранения, и поэтому третий игрок сохраняет данные на половину от второго игрока.

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

Видимо получает данные того, кто подключился на его id и успел авторизоваться, но это абсурд. Запрос не может выполняться более 5 секунд, даже если, он и немного задержится по пути.
Reply
#6

eakwarp верно говорит. Дело в ваших кривых запросах. Подразумевается не самостоятельная строка запроса, а её составляющая в целевой системе.

Я так понял в определённом месте у вас есть несколько mysq_query, но т.к. они не привязаны к потокам а формирование строки запроса может происходить позже чем первый запрос, соответственно и позже чем зайдёт уже новый игрок под тем же ID. Выход: Формируйте строку или все строки сразу. В общем проблемы в самом плагине нет 100%

p.s. Использование потоков MySQL на самом деле кроет в себе ОЧЕНЬ много интересных моментов. Ваш случай такая мелочь на фоне остального, что наверное вам лучше следует вернутся к использованию по старинке.
Reply
#7

Quote:
Originally Posted by AirKite
Посмотреть сообщение
eakwarp верно говорит. Дело в ваших кривых запросах. Подразумевается не самостоятельная строка запроса, а её составляющая в целевой системе.

Я так понял в определённом месте у вас есть несколько mysq_query, но т.к. они не привязаны к потокам а формирование строки запроса может происходить позже чем первый запрос, соответственно и позже чем зайдёт уже новый игрок под тем же ID. Выход: Формируйте строку или все строки сразу. В общем проблемы в самом плагине нет 100%

p.s. Использование потоков MySQL на самом деле кроет в себе ОЧЕНЬ много интересных моментов. Ваш случай такая мелочь на фоне остального, что наверное вам лучше следует вернутся к использованию по старинке.
И как можно устранить эту проблему? Вместо 4-ех использовать 1 запрос? Но тогда он получится очень очень большим и не факт, что пройдет...
Reply
#8

Quote:
Originally Posted by Egor123
Посмотреть сообщение
И как можно устранить эту проблему?
Я же уже написал выше. Если зачем то требуется выполнить несколько последовательных запросов уже после того как игрок вышел. То используй УЖЕ СФОРМИРОВАННЫЕ СТРОКИ или переменные в которые никаким образом не попадут данные от игрока с таким же идом. Но в любом случае лучше всего делать 1 запрос.

Quote:
Originally Posted by Egor123
Посмотреть сообщение
Вместо 4-ех использовать 1 запрос? Но тогда он получится очень очень большим и не факт, что пройдет...
Что значит не факт что пройдёт? На чём это основано? Используй большой массив что бы точно всё влезло.
Reply
#9

У меня запрос один, т.е. для каждого игрока один запрос, но проблема такая имеется.
Reply
#10

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
запросы прямее нету.
если бы они были кривые то не работало во всех случаях.
А речь идёт про редкие случаи сбоя работы.
Где нибудь хреново данные нулите, сессию не закрываете, и прочие подобные причины.
Reply
#11

Есть ли смысл в таком виде массива для форматирования запроса сохранения?

pawn Код:
new string[MAX_PLAYERS][4000];

stock SaveAccounts(playerid)
{
     format(string[playerid], sizeof(string[playerid]), "блаблабла", блаблабла);
}
Сейчас же используется без [MAX_PLAYERS]
Reply
#12

Quote:
Originally Posted by Egor123
Посмотреть сообщение
Есть ли смысл в таком виде массива для форматирования запроса сохранения?

pawn Код:
new string[MAX_PLAYERS][4000];

stock SaveAccounts(playerid)
{
     format(string[playerid], sizeof(string[playerid]), "блаблабла", блаблабла);
}
Сейчас же используется без [MAX_PLAYERS]
Только здесь сайзоф не сработает.
Reply
#13

Quote:
Originally Posted by Egor123
Посмотреть сообщение
Есть ли смысл в таком виде массива для форматирования запроса сохранения?

pawn Код:
new string[MAX_PLAYERS][4000];

stock SaveAccounts(playerid)
{
     format(string[playerid], sizeof(string[playerid]), "блаблабла", блаблабла);
}
Сейчас же используется без [MAX_PLAYERS]
Если уже додумался убрать [MAX_PLAYERS] то зачем в посте пишешь его? Что за блаблабла? Мы должны угадывать что там у тебя или как?
Reply
#14

Quote:
Originally Posted by AirKite
Посмотреть сообщение
Если уже додумался убрать [MAX_PLAYERS] то зачем в посте пишешь его? Что за блаблабла? Мы должны угадывать что там у тебя или как?
Думаю если прочитать все сообщение, а не только код, то можно найти все ответы на свои вопросы. Под "блаблабла" код запроса сохранения данных аккаунта в таблицу.

Я не додумывался убирать MAX_PLAYERS потому что его и не использую.

По этому и интересуюсь, есть ли смысл в том, чтобы его добавить?
Reply
#15

Quote:
Originally Posted by Egor123
Посмотреть сообщение
Думаю если прочитать все сообщение, а не только код, то можно найти все ответы на свои вопросы. Под "блаблабла" код запроса сохранения данных аккаунта в таблицу.

Я не додумывался убирать MAX_PLAYERS потому что его и не использую.

По этому и интересуюсь, есть ли смысл в том, чтобы его добавить?
Прочитал я от и до, сразу не понял по тем или иным причинам. Теперь ясно. Есть в этом смысл или нет, зависит от других участков кода. Но в целом конечно я бы в любом случае так не стал делать.
Reply
#16

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Только здесь сайзоф не сработает.
сработает, только надо правильно обратиться:
pawn Код:
new string[MAX_PLAYERS][4000];

stock SaveAccounts(playerid)
{
     format(string[playerid], sizeof(string[]), "%s", "Lorem ipsum dolor sit amet");
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)