我有一个程序使用风暴0.14 ,它给了我这个错误在Windows上:
sqlite3.OperationError:数据库表被locking
事情是,在Linux下它工作正常。
我有这样的印象,只有在完成了一定的修改之后才会发生,就像在某些代码中发生的那样,它会复制大量的对象。
打开debugging模式给了我这个在Windows上:
83 EXECUTE:'UPDATE regularorder_product SET discount =? WHERE regularorder_product.order_id =? AND regularorder_product.product_id =?',(Decimal(“25.00”),788,274) 84完成 85 EXECUTE:'UPDATE repeated_orders SET nextDate =? WHERE repeated_orders.id =?',(datetime.date(2009,3,31),189) 86错误:数据库表被locking
在linux上:
83 EXECUTE:'UPDATE regularorder_product SET discount =? WHERE regularorder_product.order_id =? AND regularorder_product.product_id =?',(Decimal(“25.00”),789,274) 84完成 85 EXECUTE:'UPDATE repeated_orders SET nextDate =? WHERE repeated_orders.id =?',(datetime.date(2009,3,31),189) 86完成
视窗
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对象。
“数据库表被锁定”的错误往往是SQLite的通用/默认错误,所以缩小你的问题并不明显。
你能够执行任何 SQL查询吗? 我会从那里开始,并获得一些基本的SELECT语句工作。 这可能只是一个权限问题。
很难说没有关于你的数据库访问结构(这是使用风暴有点模糊)的一点点信息。
我会先阅读这些文件。 他们包含非常相关的信息:
你正在运行任何类型的防病毒扫描仪? 防病毒扫描程序在更新后会频繁锁定文件,以便在不更改文件的情况下进行检查。 这也许可以解释为什么在进行了很多更改之后你会得到这个错误。 防病毒扫描器有更多的新数据要扫描。
如果您正在运行防病毒扫描程序,请尝试将其关闭,看看是否可以重现此问题。
在我看来,风暴已经破裂,尽管我的第一个猜测是病毒扫描器,正如Brian所建议的那样。
你有没有尝试过使用sqlite3_busy_timeout()
设置超时时间非常高? 这可能会导致SQLite3
等待足够长的锁持有者,无论是谁,释放锁。
我现在通过用最新版本替换sqlite3-dll解决了这个问题。 我仍然不确定这是否是sqlite的windows代码中的一个错误,或者如果python在windows上安装了比linux更早的版本。
谢谢你的帮助。