0

Fedora Linux で sqlite3 3.6.23.1 バージョンを使用しています。データベースにアクセスするために 2 つのスレッドを実行しています。両方のスレッドが同じテーブルで書き込み操作を実行しようとする可能性があります。

最初のスレッドが書き込み操作を実行しているときにテーブルがロックされます。この場合の処理​​方法を教えてください。

別のスレッドが書き込み操作を完了するまで待ってからテーブルに書き込むなどの C、sqlite3 API メカニズムはありますか。

ありがとうございます。それでは、お元気で。

-プラビーン

4

1 に答える 1

1

here で説明されているように、C API を介して設定できる「共有キャッシュ」モードがあります。

Sqlite3 は同時実行性を最大限に高め、スレッドセーフでもあります。詳細については、ファイルのロックと同時実行に関するドキュメントを参照してください。

テーブルは実際に書き込み操作中にロックされますが、sqlite3 はロックが解放されるのを待つことでこの状態をナビゲートすることができ、その後、書き込み (または読み取り) を実行したい 2 番目のプロセス/スレッドにロックが付与されます。 )。ロックを待機するタイムアウトは、sqlite 接続コードで構成できます。Python 2.7 の構文は次のとおりです。

sqlite3.connect(database[, timeout, detect_types, isolation_level, 
                check_same_thread, factory, cached_statements])

デフォルトのタイムアウトは 5.0 秒です。そのため、その時間ロックを保持するには、かなり大きな SELECT または COMMIT トランザクションが必要になります。ただし、ユースケースに基づいて、タイムアウトを微調整するか、タイムアウト例外をキャッチするコードを含めることができます。

最後のオプションは、DB へのアクセスを試行する前に、フラグがクリアされるまで競合するスレッドが待機することを要求する何らかのフラグメカニズムをコードに組み込むことです。彼らの仕事の一部。

これは、古いバージョンの sqlite がロックを取得できない場合に1 秒間スリープする可能性があるという問題を概説している興味深い記事です。

于 2013-06-17T08:36:54.180 に答える