2009-03-24 14 views
3

私はstorm 0.14を使用するプログラムの開発を持っているし、それは私の窓に、このエラーを与える問題:なぜWindowsはsqlite3.OperationalErrorを与え、Linuxはそうしないのですか?

 
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"), 789, 274) 
84 DONE 
85 EXECUTE: 'UPDATE repeated_orders SET nextDate=? WHERE repeated_orders.id = ?', (datetime.date(2009, 3, 31), 189) 
86 DONE 

システム情報

のWindows

  • 勝利:Linux上で

     
    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 
    

    dows 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 

質問

は、WindowsとLinuxの間で異なるsqlite3の/のpythonについては何がありますか?このバグの原因は何か、どうすれば修正できますか?エラーが発生した場所でCOMMITを追加する場合

別の観察

、このエラーが代わりにスローされます。答え

からsqlite3.OperationalError: cannot commit transaction - SQL statements in progress

回答を私は複数のスレッド/プロセスを使用していませんよ、したがって並行性は問題ではないはずですし、Storeオブジェクトも1つしかありません。

答えて

1

私は現在、sqlite3-dllを最新のバージョンに置き換えることで問題を解決しました。私はこれがsqliteのWindowsコードのバグか、PythonがLinuxよりも古いバージョンのWindowsをインストールしたのかどうかはまだ分かりません。

ありがとうございました。

+0

sqlite3のバージョンを確認するには、 'import sqlite3'、 'print sqlite3.sqlite_version'を実行します。元のsqlite3.dllを元に戻すと、比較することができます。 –

+0

私はそれを試してみるよ、ありがとう。 –

+0

Linux:3.5.9、Windows:3.4.4、かなり違います。 –

1

"データベーステーブルがロックされています"というエラーはSQLiteのジェネリック/デフォルトエラーであることが多いため、問題の絞り込みは明白ではありません。

SQLクエリを実行できますか?私はそこから始め、いくつかの基本的なSELECT文を処理します。それは許可の問題だけかもしれません。

+0

はい、完全に動作する前に40文。 (最後のものは問題に含まれています) –

1

あなたは、アンチウイルススキャナの任意の並べ替えを実行していますか?ウィルス対策スキャナは、更新されたファイルを頻繁にロックするため、ファイルを変更せずに検査することができます。これは、多くの変更が行われた後にこのエラーが発生する理由を説明します。アンチウイルススキャナにはスキャンする新しいデータがさらにあります。

ウイルス対策スキャナを実行している場合は、このウイルス対策プログラムをオフにして、この問題を再現できるかどうかを確認してください。

+0

時々手動でClamAVのみを手動で実行します。 –

1

嵐が壊れているように見えますが、私の最初の推測はブライアンが提案したようにウイルススキャナでした。

sqlite3_busy_timeout()を使用してタイムアウトを非常に高く設定しましたか?これにより、ロックホルダー、つまり誰でもロックを解除するのに十分な時間待つことがあります(SQLite3)。

+0

5秒で十分でしょうか?私は嵐の "python"バージョンを使用しているので、WindowsとLinuxの違いはありません。私は現在、sqliteの異なるバージョンがインストールされているかどうか調べています。 –

関連する問題