为什么Windows提供了一个sqlite3.OperationalError和Linux不?

问题

我有一个程序使用风暴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完成

系统信息

视窗

  • Windows XP SP 3
  • Python 2.5.4
  • NTFS分区

Linux的

  • Ubuntu 8.10
  • Python 2.5.2
  • ext3分区

一些代码

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对象。

Solutions Collecting From Web of "为什么Windows提供了一个sqlite3.OperationalError和Linux不?"

“数据库表被锁定”的错误往往是SQLite的通用/默认错误,所以缩小你的问题并不明显。

你能够执行任何 SQL查询吗? 我会从那里开始,并获得一些基本的SELECT语句工作。 这可能只是一个权限问题。

很难说没有关于你的数据库访问结构(这是使用风暴有点模糊)的一点点信息。

我会先阅读这些文件。 他们包含非常相关的信息:

  1. https://storm.canonical.com/Manual#SQLite%20and%20threads

  2. http://sqlite.org/lockingv3.html

你正在运行任何类型的防病毒扫描仪? 防病毒扫描程序在更新后会频繁锁定文件,以便在不更改文件的情况下进行检查。 这也许可以解释为什么在进行了很多更改之后你会得到这个错误。 防病毒扫描器有更多的新数据要扫描。

如果您正在运行防病毒扫描程序,请尝试将其关闭,看看是否可以重现此问题。

在我看来,风暴已经破裂,尽管我的第一个猜测是病毒扫描器,正如Brian所建议的那样。

你有没有尝试过使用sqlite3_busy_timeout()设置超时时间非常高? 这可能会导致SQLite3等待足够长的锁持有者,无论是谁,释放锁。

我现在通过用最新版本替换sqlite3-dll解决了这个问题。 我仍然不确定这是否是sqlite的windows代码中的一个错误,或者如果python在windows上安装了比linux更早的版本。

谢谢你的帮助。