我有一个使用storm 0.14的程序,它在Windows上给我这个错误:
sqlite3.OperationError: database table is locked
问题是,在linux下它可以正常工作。
我的印象是,只有在完成一定数量的更改后才会发生这种情况,就像在某些代码中发生的那样,会复制很多对象。
启用调试模式会在Windows上显示此内容:
83 EXECUTE: 'UPDATE regularorder_product SET discount=? WHERE regularorder_product.order_id = ? AND regularorder_product.product_id = ?', (Decimal("25.00"), 788, 274) 84 DONE 85 EXECUTE: 'UPDATE repeated_orders SET nextDate=? WHERE repeated_orders.id = ?', (datetime.date(2009, 3, 31), 189) 86 ERROR: database table is locked
在linux上:
83 EXECUTE: 'UPDATE regularorder_product SET discount=? WHERE regularorder_product.order_id = ? AND regularorder_product.product_id = ?', (Decimal("25.00"), 789, 274) 84 DONE 85 EXECUTE: 'UPDATE repeated_orders SET nextDate=? WHERE repeated_orders.id = ?', (datetime.date(2009, 3, 31), 189) 86 DONE
窗
的Linux
def createRegularOrderCopy(self):
newOrder = RegularOrder()
newOrder.date = self.nextDate
# the exception is thrown on the next line,
# while calling self.products.__iter__
# this happens when this function is invoked the second time
for product in self.products:
newOrder.customer = self.customer
newOrder.products.add(product)
return newOrder
orders = getRepeatedOrders(date)
week = timedelta(days=7)
for order in orders:
newOrder = order.createRegularOrderCopy()
store.add(newOrder)
order.nextDate = date + week
有什么关于sqlite3 / python在windows和linux之间有什么不同吗?这个错误可能是什么原因以及如何解决?
在发生错误的位置添加COMMIT
时,会抛出此错误:sqlite3.OperationalError: cannot commit transaction - SQL statements in progress
我没有使用多个线程/进程,因此并发应该不是问题,而且我只有一个Store对象。
答案 0 :(得分:1)
“数据库表被锁定”错误通常是SQLite中的泛型/默认错误,因此缩小您的问题并不明显。
您是否能够执行任何 SQL查询?我会从那里开始,并获得一些基本的SELECT语句。它可能只是一个权限问题。
答案 1 :(得分:1)
很难说没有关于数据库访问结构的更多信息(使用Storm有点模糊)。
我首先阅读这些文件;它们包含非常相关的信息:
答案 2 :(得分:1)
您是否正在运行任何类型的防病毒扫描程序?防病毒扫描程序会在文件更新后经常锁定文件,以便在不更改文件的情况下对其进行检查。这可以解释为什么在经过大量更改后会出现此错误;反病毒扫描程序有更多新数据需要扫描。
如果您正在运行防病毒扫描程序,请尝试将其关闭,看看是否可以重现此问题。
答案 3 :(得分:1)
在我看来风暴已经破碎,尽管我的第一个猜测是布莱恩建议的病毒扫描程序。
您是否尝试使用sqlite3_busy_timeout()
将超时设置得非常高?这可能导致SQLite3
等待锁定持有者,无论是谁,都要释放锁定。
答案 4 :(得分:1)
我已经用最新版本替换sqlite3-dll解决了这个问题。我仍然不确定这是否是sqlite的windows代码中的错误,或者如果python在Windows上安装的旧版本比在linux上安装旧版本。
感谢您的帮助。