Форум сайта python.su
Есть классическая задача про поставщика/потребителя, когда нужно выполнить 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()
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()
Офлайн
повеселили :)
Офлайн
А потом мы добавили LOCK TABLE, и тормознули крутейший сервер :) Что у вас за логика такая что табличной блокировки требует?
Офлайн
PooH, sqlite на “крутейшем сервере” никто не использует, так что я не вижу тут никакого криминала. Даже больше скажу – сам так делаю. Для того, чтобы ловить собственные логические ошибки. Иногда очень помогает.
Офлайн