В 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()