Найти - Пользователи
Полная версия: sqlite3 как заблокировать бд для задачи про поставщика/потребителя
Начало » Базы данных » sqlite3 как заблокировать бд для задачи про поставщика/потребителя
1
dimabest
Есть классическая задача про поставщика/потребителя, когда нужно выполнить 2 запроса: SELECT (узнать количество товара) и UPDATE (изменить количество товара). Между двумя запросами таблицу нужно заблокировать на чтение/запись от других потоков.

В sqlite3 нет команды ‘LOCK TABLE’, зато есть транзакции и свойство isolation_level, которое указывает с каким видом блокировки запускать транзакцию. Для моей задачи нужна блокировка чтения/записи, а именно ‘EXCLUSIVE’.

import sqlite3
import time

con = sqlite3.connect('catalog.sqlite', isolation_level='EXCLUSIVE')
c = con.cursor()

c.execute('SELECT * FROM test WHERE id=1')

# засыпаем на 5 секунд
time.sleep(5)

c.execute('UPDATE test SET name="first" WHERE id=1')

con.commit()
c.close()
con.close()
Запускаю параллельно другую программу - она без проблем читает и обновляет таблицу пока первая спит между запросами!

Почему?
Sqlite автоматически стартует транзакции только для запросов изменяющих данные (а для SELECT - нет).

Чтобы правильно заблокировать бд в задаче про поставщика/потребителя нужно - установить isolation_level в None, а транзакцию стартовать и завершать руками:

con = sqlite3.connect('catalog.sqlite')
con.isolation_level = None

c = con.cursor()

c.execute('BEGIN EXCLUSIVE TRANSACTION')

c.execute('SELECT * FROM test WHERE id=1')
c.execute('UPDATE test SET name="first" WHERE id=1')

c.execute('COMMIT TRANSACTION')

c.close()
con.close()
ps: пока набрал вопрос - проблему решил :)
sypper-pit
повеселили :)
PooH
А потом мы добавили LOCK TABLE, и тормознули крутейший сервер :) Что у вас за логика такая что табличной блокировки требует?
ZZZ
PooH, sqlite на “крутейшем сервере” никто не использует, так что я не вижу тут никакого криминала. Даже больше скажу – сам так делаю. Для того, чтобы ловить собственные логические ошибки. Иногда очень помогает.
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