Почему Windows выдает sqlite3.OperationalError, а Linux - нет? - PullRequest
3 голосов
/ 24 марта 2009

проблема

У меня есть программа, которая использует 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

  • 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.

Ответы [ 5 ]

1 голос
/ 25 марта 2009

Я решил проблему, заменив sqlite3-dll самой новой версией. Я до сих пор не уверен, была ли это ошибка в коде Windows sqlite или Python установил в Windows более старую версию, чем в Linux.

Спасибо за вашу помощь.

1 голос
/ 25 марта 2009

Мне кажется, что шторм сломан, хотя я предположил, что, как предположил Брайан, был вирусный сканер.

Вы пытались использовать sqlite3_busy_timeout(), чтобы установить очень большое время ожидания? Это может привести к тому, что SQLite3 будет достаточно долго ждать, пока держатель замка, кто бы это ни был, освободит замок.

1 голос
/ 24 марта 2009

Трудно сказать, не имея немного больше информации о структуре доступа к вашей базе данных (что немного скрыто при использовании Storm).

Я бы начал с чтения этих документов; они содержат очень важную информацию:

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

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

1 голос
/ 25 марта 2009

Вы используете какие-либо антивирусные сканеры? Антивирусные сканеры часто блокируют файл после его обновления, чтобы они могли проверить его без изменения. Это может объяснить, почему вы получаете эту ошибку после большого количества изменений; антивирусный сканер имеет больше новых данных для сканирования.

Если вы используете антивирусный сканер, попробуйте выключить его и посмотреть, сможете ли вы воспроизвести эту проблему.

1 голос
/ 24 марта 2009

Ошибка «таблица базы данных заблокирована» часто является общей ошибкой / ошибкой по умолчанию в SQLite, поэтому сужение проблемы не очевидно.

Можете ли вы выполнить любые SQL-запросы? Я бы начал там и получил несколько базовых операторов SELECT. Это может быть просто проблема с разрешениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...