Python SQLite: 数据库被锁定

69

我尝试了这段代码:

import sqlite

connection = sqlite.connect('cache.db')
cur = connection.cursor()
cur.execute('''create table item
  (id integer primary key, itemno text unique,
        scancode text, descr text, price real)''')

connection.commit()
cur.close()

我正在捕获这个异常:

Traceback (most recent call last):
  File "cache_storage.py", line 7, in <module>
    scancode text, descr text, price real)''')
  File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 237, in execute
    self.con._begin()
  File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 503, in _begin
    self.db.execute("BEGIN")
_sqlite.OperationalError: database is locked

cache.db的权限没问题。有什么想法吗?

23个回答

0
我正在使用sqlite3,通过添加事务隔离级别来解决块问题 conn = sqlite3.connect('image.db',isolation_level=None,timeout=0.01);

0
在我的情况下,当很多并发进程尝试读/写同一张表时,就会出现错误。我使用重试来解决这个问题。
def _retry_if_exception(exception):
    return isinstance(exception, Exception)

@retry(retry_on_exception=_retry_if_exception,
       wait_random_min=1000,
       wait_random_max=5000,
       stop_max_attempt_number=5)
def execute(cmd, commit=True):
   c.execute(cmd)
   c.conn.commit()

0

我发现这个对我的需求很有效(线程锁定):

conn = sqlite3.connect(database, timeout=10)

文档

sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])

当一个数据库被多个连接访问时,如果其中一个进程修改了数据库,那么SQLite数据库将被锁定,直到该事务被提交。timeout参数指定连接应等待锁定消失的时间,直到引发异常。timeout参数的默认值为5.0(五秒)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接