Форум сайта python.su
Насколько я понял sqlite позволяет читать многопоточно, что мешает инкрементировать значение переменной при многопоточном обращении к базе данных.
Как можно исправить?
Офлайн
DHT
я так понял инкементация идет в клиентском коде? а что если сделать средствами sqlite - то есть отдельным запросом.
p.s. а что, в MySQL/mariadb, PostgreSQL можно блокировать запись на чтение?
Офлайн
Проблема в том, что если несколько потоков пытаются инкрементировать одну и туже запись в таблице.
Select разрешает многопоточное чтение и в результате этого потоки получают одинаковое начальное значение.
А вот Replace уже делается поочередно, но поскольку все потоки получили одинаковые значения на входе, то получается, что все потоки инкрементируют на 1, а должны бы инкрементировать на 1*N потоков.
Офлайн
Если до Select сделать Insert, то БД будет заблокирована.
Как более элегантно заблокировать БД?
Офлайн
дважды insert - дважды медленнее :(
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?
Офлайн
А как задача целиком стоит? Может стоит завести отдельный поток, заведующий этим счетчиком? Может он вообще может держать счетчик в памяти, время от времени сбрасывая в базу?
Офлайн
в Django через MIDDLEWARE_CLASSES вызывает предварительная обработка запросов.
точнее ведется активность запросов с IP адреса.
данные хранятся в базе данных SQLite.
т.е. при запросе нужно сделать SELECT по IP из базы, инкременировать и переписать запись для этогой IP в базе (INSERT OR REPLACE).
проблемы появляются при множестве параллельных запросов с одного IP, т.к. SELECT разрешает многопоточное чтение, то все потоки видят одно и тоже значение для IP.
Офлайн
Я бы это дело считал в memcached или redis - атомарный инкремент по ключу это их работа. А отдельным процессом бы сохранял состояние в базу раз в н-цать минут, ну и поднимал бы из базы при запуске.
Офлайн
DHT
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?
Офлайн
BudulianinУгу, создать кучу параллельных процессов, и заблокировать их всех на таблице
Так
Офлайн