Задать вопрос
iamserge
@iamserge

C#+MySQL как избежать блокировок таблиц?

Собственно использую MEMORY таблицы, одноврменно я пишу в нее (0.1 - 10/сек), обновляю в два потока отдельно разные колонки: до 10к сек - первый поток / 2-3к в секунду - второй. Но это в пиках, обычно меньше т.е. он все посчитать успевает и новых просто столько нет.

Eсли запись + один поток с UPDATE - у MySQL еще получается тянуть это, но стоит добавить второй поток и у меня очередь скапливается безнадежно большая т.к. MySQL валится с таймаутами, с ... В том числе делаю SELECT'ы пока не особо активно (т.е. не удается наладить работу) - но и их будет не так уж и мало - примерно в пределах 100к записей в мин.

Нашел тут и до сих пор не хочу в это верить:

MySQL использует табличные блокировки для подсистем хранения MyISAM, MEMORY, MERGE, но вы можете явно заблокировать таблицу в любой подсистеме хранения командой LOCK TABLES, о которой мы поговорим ниже.


1. Это просто ужас, как это обойти? Как перейти к строкам хотя бы? Лучше еще к ячейкам ...
2. Продумывал вариант через PRIMARY_KEY (он число всего-то) заменить обновление созданием новой таблицы, куда складывать пару значение PRIM_KEY + то что насчитал ... Но SELECT'ы будут медленнее в итоге, ... Да и в целом это первое что пришло в голову - не знаю как такое решение себя покажет, мало ли какие там еще встретятся проблемы ...

Таблицы в пределах 1,5 млн. записей и размер небольшой 200Мб. На диск не могу перейти, таблиц довольно много и SSD от этого чувствует себя ужасно и умирает быстро, потоков удается сделать совсем мало ... В общем совсем не вариант.

Вот собственно и проблема - сыпятся ошибки MySQL'я и иногда SELECT'ов приходится ждать очень долго (провисают на пол минуты, ну видимо из-за очереди забитой в пиках), хотя формально скорости памяти и ресурсов хватает гонять много потоков - по факту все на этом заступорилось ...
  • Вопрос задан
  • 302 просмотра
Подписаться 3 Средний 24 комментария
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы