Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2014 17:15:39

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

Насколько я понял sqlite позволяет читать многопоточно, что мешает инкрементировать значение переменной при многопоточном обращении к базе данных.

Как можно исправить?



Офлайн

#2 Авг. 7, 2014 23:32:06

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

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

p.s. а что, в MySQL/mariadb, PostgreSQL можно блокировать запись на чтение?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Авг. 8, 2014 08:30:38

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

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



Офлайн

#4 Авг. 8, 2014 13:55:00

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

Если до Select сделать Insert, то БД будет заблокирована.
Как более элегантно заблокировать БД?



Офлайн

#5 Авг. 14, 2014 23:26:21

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

дважды insert - дважды медленнее :(

как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?



Офлайн

#6 Авг. 15, 2014 05:46:20

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

А как задача целиком стоит? Может стоит завести отдельный поток, заведующий этим счетчиком? Может он вообще может держать счетчик в памяти, время от времени сбрасывая в базу?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Авг. 15, 2014 12:34:46

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

в Django через MIDDLEWARE_CLASSES вызывает предварительная обработка запросов.
точнее ведется активность запросов с IP адреса.
данные хранятся в базе данных SQLite.

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

проблемы появляются при множестве параллельных запросов с одного IP, т.к. SELECT разрешает многопоточное чтение, то все потоки видят одно и тоже значение для IP.



Офлайн

#8 Авг. 15, 2014 13:58:56

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

Я бы это дело считал в memcached или redis - атомарный инкремент по ключу это их работа. А отдельным процессом бы сохранял состояние в базу раз в н-цать минут, ну и поднимал бы из базы при запуске.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Авг. 15, 2014 22:47:39

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

DHT
как заблокировать БД между первым select и последующим insert для внесения потокобезопасных изменения в запись?

Так



Офлайн

#10 Авг. 16, 2014 04:34:38

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Запретить многопоточное чтение из базы данных sqite3

Budulianin
Так
Угу, создать кучу параллельных процессов, и заблокировать их всех на таблице



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version