Получение блокировки чтения / записи для параллельных обновлений Sqlite - PullRequest
2 голосов
/ 05 апреля 2011

Я пишу много параллельных сценариев на python для исследовательских целей, и мне было интересно, можно ли вручную получить блокировку чтения / записи в sqlite для определенного набора команд.Вот упрощенный пример того, почему мне это нужно:

Простой пример:
Предположим, у меня есть таблица ( A ), и я хочупросто посчитайте количество строк в нем и сохраните результат в другой таблице ( B ) параллельно.Для этого я запускаю 10 экземпляров программы, которая считает строки для определенного диапазона A и добавляет сумму строк к свойству в B .

Проблема в том, что мне нужно прочитать свойство в B, добавить его к счетчику экземпляра и сохранить;убедившись, что ни один из других экземпляров не выполняет этот процесс.Обычно требуется только блокировка записи - в этом случае мне также нужна блокировка чтения ...

Я надеялся, что смогу сделать что-то вроде этого:

  1. блокировка чтения / записи
  2. Захватить текущее значение в B , добавить его к счетчику экземпляров
  3. сохранить новое значение
  4. разблокировать

Есть ли способ сделать это?

Спасибо.

1 Ответ

3 голосов
/ 05 апреля 2011

Вы можете увеличить целочисленное значение с помощью одного оператора UPDATE:

sqlite> CREATE TABLE B(Id INTEGER, Value INTEGER);
sqlite> INSERT INTO B VALUES(0, 15);
sqlite> UPDATE B SET Value=Value + 23 WHERE Id = 0;
sqlite> SELECT * FROM B;
0|38
sqlite> 

Использование одного оператора UPDATE делает эту операцию атомарной, что делает ненужной любую дополнительную блокировку.

Если вам требуется более сложная обработка, вы можете использовать транзакции SQL , чтобы гарантировать, что любые сложные операции с базой данных выполняются атомарно.

В общем, вам следует избегать любых блокировок, внешних по отношению к SQLite, или работы сПодсистема блокировки SQLite - это очень хороший рецепт для взаимоблокировок ...

РЕДАКТИРОВАТЬ:

Чтобы добавить строку, вы можете использовать оператор конкатенации ||:

sqlite> CREATE TABLE C(Id INTEGER, Value TEXT);
sqlite> INSERT INTO C VALUES(0, 'X');
sqlite> UPDATE C SET Value=Value || 'Y' WHERE Id = 0;
sqlite> SELECT * FROM C;
0|XY
sqlite> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...