2011-10-07 5 views
6

私は、進行中の操作中にダウンロードする必要のあるシステム上にsqlite3データベースを持っています。アクセスしているプロセスを停止または一時停止することはオプションではありません。だから私がこれを理解する限り、ダウンロード中にDBの変更や破損を避けるために、ダウンロード中にSHAREDロック(http://www.sqlite.org/lockingv3.htmlに記載)をdbに保持する必要があります。このようなロックを明示的に取得するにはどうすればよいですか?ダウンロードはC++プログラムから制御されているので、ロックを取得する必要があります。ファイルダウンロードのためにsqlite3 dbをロックする

EDIT:thkalaはダンプを作成することを推奨します。しかし、DBの完全なコピーに十分なメモリがあるかどうかわからないので、ロックを含む解決策を見つけることを好むでしょう。

答えて

8

いいえ、いいえ。いいえ、いいえ!

手でファイルをロックしたりコピーしたりするのは古い方法です。 SQLiteは今あなたが使用できる適切なbackup APIを持っています。これは、SQLiteデータベースのオンラインコピーを実行するために推奨される方法です。データベースのコピーを作成するときに使用できます。このコピーは、都合の良いときにダウンロードできます。

EDIT:

あなたは絶対にロックを使用するを持っている場合は、メソッドがhereを概説使用することができます - おそらくCに翻訳した後:

  • オープンデータベース

  • 使用BEGIN IMMEDIATEステートメントは、共有ロックを取得します。

  • ファイルを手動でコピー/ダウンロードしてください。ファイルが不足していないことを確認してください。少なくともDBファイル、ジャーナルファイル、おそらくWALファイルがあります。物事をより簡単にするために、DBを別のディレクトリに置くこともできます。

  • ROLLBACKあなたが今始めたトランザクション。

私は、この方法はいくつかのケースで役立つことができる方法を理解し、私はこのが、それ以上に推奨される方法ではないことを繰り返す必要があります。

+0

バックアップAPIについてはわかりませんでした。 – RushPL

+0

バックアップAPIを使用することは、データベースの完全なコピーを作成するのに十分な空き容量があるかわかりません。 –

-3

ここの解決法は間違っています。後世のために残しておき、なぜ人々が悪い考えであるかを知ることができます。

ジャーナルと一緒にデータベースをコピーすることもできます(dbとジャーナルの両方をtmpファイルにコピーしてからダウンロードしてください)。リモートエンドでこのデータベースを開くと、それ自体が修正されます。これは、アプリケーションが適切なトランザクションを使用していることを前提としています。

それは間違っている理由を説明するコメントの下にお読みください:

をその要旨は、あなたはデシベル&ジャーナルをコピーすることができますが、あなた は、時間内に正確に同じ瞬間からBOTH得ることができる場合にのみ、 。

これは多かれ少なかれ不可能です。

+3

NO!いいえ!いいえ!データ破損のためのこのレシピ*! DBジャーナルには適切なファイルシステムセマンティクスが必要です。これはネットワーク経由でファイルをコピーするときには必要ありません。 -1 – thkala

+0

問題1:ジャーナルの前後に、ウェブ上でDBファイルが秒間、または分*ダウンロードされる可能性があります。 – thkala

+0

コピー中に書き込みアクセスがあっても動作しないと思います。 –

2

私は種類の溶液を見落とし:

BEGIN IMMEDIATE TRANSCTION 

との取引を開始し、ロックをAQUIREする

END TRANSACTION 

で終了し 。 IMMEDIATEキーワードはデフォルトではなく、コールが戻ったときにdbはすでにロックされています(RESERVEDロック取得済み)。

関連する問題