DHT
Авг. 7, 2014 17:15:39
Насколько я понял sqlite позволяет читать многопоточно, что мешает инкрементировать значение переменной при многопоточном обращении к базе данных.
Как можно исправить?
JOHN_16
Авг. 7, 2014 23:32:06
DHT
я так понял инкементация идет в клиентском коде? а что если сделать средствами sqlite - то есть отдельным запросом.
p.s. а что, в MySQL/mariadb, PostgreSQL можно блокировать запись на чтение?
DHT
Авг. 8, 2014 08:30:38
Проблема в том, что если несколько потоков пытаются инкрементировать одну и туже запись в таблице.
Select разрешает многопоточное чтение и в результате этого потоки получают одинаковое начальное значение.
А вот Replace уже делается поочередно, но поскольку все потоки получили одинаковые значения на входе, то получается, что все потоки инкрементируют на 1, а должны бы инкрементировать на 1*N потоков.
DHT
Авг. 8, 2014 13:55:00
Если до Select сделать Insert, то БД будет заблокирована.
Как более элегантно заблокировать БД?
DHT
Авг. 14, 2014 23:26:21
дважды insert - дважды медленнее :(
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?
PooH
Авг. 15, 2014 05:46:20
А как задача целиком стоит? Может стоит завести отдельный поток, заведующий этим счетчиком? Может он вообще может держать счетчик в памяти, время от времени сбрасывая в базу?
DHT
Авг. 15, 2014 12:34:46
в Django через MIDDLEWARE_CLASSES вызывает предварительная обработка запросов.
точнее ведется активность запросов с IP адреса.
данные хранятся в базе данных SQLite.
т.е. при запросе нужно сделать SELECT по IP из базы, инкременировать и переписать запись для этогой IP в базе (INSERT OR REPLACE).
проблемы появляются при множестве параллельных запросов с одного IP, т.к. SELECT разрешает многопоточное чтение, то все потоки видят одно и тоже значение для IP.
PooH
Авг. 15, 2014 13:58:56
Я бы это дело считал в memcached или redis - атомарный инкремент по ключу это их работа. А отдельным процессом бы сохранял состояние в базу раз в н-цать минут, ну и поднимал бы из базы при запуске.
Budulianin
Авг. 15, 2014 22:47:39
DHT
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?
Так
PooH
Авг. 16, 2014 04:34:38
Budulianin
Так
Угу, создать кучу параллельных процессов, и заблокировать их всех на таблице