Найти - Пользователи
Полная версия: Запретить многопоточное чтение из базы данных sqite3
Начало » Базы данных » Запретить многопоточное чтение из базы данных sqite3
1 2
DHT
Насколько я понял sqlite позволяет читать многопоточно, что мешает инкрементировать значение переменной при многопоточном обращении к базе данных.

Как можно исправить?
JOHN_16
DHT
я так понял инкементация идет в клиентском коде? а что если сделать средствами sqlite - то есть отдельным запросом.

p.s. а что, в MySQL/mariadb, PostgreSQL можно блокировать запись на чтение?
DHT
Проблема в том, что если несколько потоков пытаются инкрементировать одну и туже запись в таблице.
Select разрешает многопоточное чтение и в результате этого потоки получают одинаковое начальное значение.
А вот Replace уже делается поочередно, но поскольку все потоки получили одинаковые значения на входе, то получается, что все потоки инкрементируют на 1, а должны бы инкрементировать на 1*N потоков.

DHT
Если до Select сделать Insert, то БД будет заблокирована.
Как более элегантно заблокировать БД?
DHT
дважды insert - дважды медленнее :(

как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?
PooH
А как задача целиком стоит? Может стоит завести отдельный поток, заведующий этим счетчиком? Может он вообще может держать счетчик в памяти, время от времени сбрасывая в базу?
DHT
в Django через MIDDLEWARE_CLASSES вызывает предварительная обработка запросов.
точнее ведется активность запросов с IP адреса.
данные хранятся в базе данных SQLite.

т.е. при запросе нужно сделать SELECT по IP из базы, инкременировать и переписать запись для этогой IP в базе (INSERT OR REPLACE).

проблемы появляются при множестве параллельных запросов с одного IP, т.к. SELECT разрешает многопоточное чтение, то все потоки видят одно и тоже значение для IP.
PooH
Я бы это дело считал в memcached или redis - атомарный инкремент по ключу это их работа. А отдельным процессом бы сохранял состояние в базу раз в н-цать минут, ну и поднимал бы из базы при запуске.
Budulianin
DHT
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?

Так
PooH
Budulianin
Так
Угу, создать кучу параллельных процессов, и заблокировать их всех на таблице
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB