为什么windows会提供sqlite3.OperationalError而Linux却没有?

时间:2009-03-24 20:38:04

标签: python windows linux sqlite

问题

我有一个使用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

系统信息

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

的Linux

  • Ubuntu 8.10
  • Python 2.5.2
  • ext3 partition

一些代码

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

5 个答案:

答案 0 :(得分:1)

“数据库表被锁定”错误通常是SQLite中的泛型/默认错误,因此缩小您的问题并不明显。

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

答案 1 :(得分:1)

很难说没有关于数据库访问结构的更多信息(使用Storm有点模糊)。

我首先阅读这些文件;它们包含非常相关的信息:

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

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

答案 2 :(得分:1)

您是否正在运行任何类型的防病毒扫描程序?防病毒扫描程序会在文件更新后经常锁定文件,以便在不更改文件的情况下对其进行检查。这可以解释为什么在经过大量更改后会出现此错误;反病毒扫描程序有更多新数据需要扫描。

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

答案 3 :(得分:1)

在我看来风暴已经破碎,尽管我的第一个猜测是布莱恩建议的病毒扫描程序。

您是否尝试使用sqlite3_busy_timeout()将超时设置得非常高?这可能导致SQLite3等待锁定持有者,无论是谁,都要释放锁定。

答案 4 :(得分:1)

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

感谢您的帮助。