2012-03-28 2 views
9

たとえば、sqlite3モジュールを使用してSQLiteファイルに格納されている同じテーブルにデータを書き込む2つのpythonスクリプトがあるとします。 SQLiteファイルはNFSファイルシステムに格納されています。 SQLite-FAQ私は以下を読んでいます:NFSファイルシステムでのsqliteファイルのロックは可能ですか?

SQLiteは、データベースへのアクセスを制御するためにリーダ/ライターのロックを使用します。 [...]ただし、データベースファイルがNFSファイルシステムに保存されている場合、このロック機構は正しく動作しない可能性があります。 これは、多くのNFS実装で fcntl()ファイルのロックが壊れているためです。複数のプロセスが ファイルに同時にアクセスしようとすると、 はSQLiteデータベースファイルをNFSに置かないようにする必要があります。

これはまったく不可能であることを意味しますか、または、あるプロセスがもう一方のプロセスが完了するまで待つことを保証する方法はありますか?

INSERTは複雑ではありません。ちょうどいくつか:

INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)" 
connection.executemany(INSERT_STATEMENT, triples) 

そして挿入されたセットは互いに素です。

次の質問:2つのプロセスが同じテーブルに書き込もうとしたとき、または同じデータベース(ファイル)に書き込もうとしたときにNFS問題が発生しますか?各プロセスが同じデータベース(ファイル)内に独自のテーブルを作成してそれに書き込むことを回避する方法ですか?

答えて

19

NFSでSQLiteを使用しないでください。それはそれと同じくらい簡単です。 NFSのセマンティクスは通常のファイルシステムとは異なり、緩いです。あなたは最終的に腐敗を受けるでしょう。 SQLite-usersメーリングリストの誰かが今すぐ "回避策"を掲示しています。彼らは短期間に見えるものの、決してうまくいかない。

+7

この男性を聞く。 [彼は権威です。](http://code.google.com/p/apsw/) –

+1

残念ながら私はSQLiteを使用する必要があります。私は各プロセスに独自のファイルを書いて渡してしまい、後でスクリプトをマージしました。しかし、あなたの答えをありがとう! :-) – Aufwind

+4

最終的に破損したら、NFSを使用したことを確認してください。そして、誰もが "それをしないでください"と答えたときには、驚かないでください。 –

関連する問題