Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 27, 2009 05:30:48

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite3 как заблокировать бд для задачи про поставщика/потребителя

Есть классическая задача про поставщика/потребителя, когда нужно выполнить 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: пока набрал вопрос - проблему решил :)



Офлайн

#2 Июнь 27, 2009 14:24:49

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

sqlite3 как заблокировать бд для задачи про поставщика/потребителя

повеселили :)

Офлайн

#3 Июнь 29, 2009 05:36:24

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

sqlite3 как заблокировать бд для задачи про поставщика/потребителя

А потом мы добавили LOCK TABLE, и тормознули крутейший сервер :) Что у вас за логика такая что табличной блокировки требует?



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

Офлайн

#4 Июнь 29, 2009 06:33:07

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

sqlite3 как заблокировать бд для задачи про поставщика/потребителя

PooH, sqlite на “крутейшем сервере” никто не использует, так что я не вижу тут никакого криминала. Даже больше скажу – сам так делаю. Для того, чтобы ловить собственные логические ошибки. Иногда очень помогает.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version