2

私は、SQLite データベース テーブルにデータを読み書きするために使用される C++ シェル拡張 DLL を使用しています。すべてのテーブルにアクセスするために使用される別のアプリケーション (exe) があります。

SQLite データベース テーブルを削除/挿入/更新しようとすると、DLL に「データベース ファイルがロックされています」という例外が表示されることがあります。これは、他のアプリケーションがこの時点でテーブルにアクセスしていたためです。

この問題を DLL から解決する方法はありますか? リンクに記載されているソリューションを使用できますか: " http://stackoverflow.com/questions/6455290/implementing-sqlite3-busy-timeout-in-an-ios-app "

現在のコードでは、 CppSQLite3.cppメソッドexecQuery (const char* szSQL) を使用して SQL クエリを実行しています。

ご意見をお聞かせください。

4

2 に答える 2

1

まず第一に、SQLite はデータベース レベルのロックを行うことを知っておく必要があります。トランザクションを開始し、他のアプリケーションが同じデータベースに何かを書き込もうとするDatabase is lockedと、SQLite はsqlite3_busy_timeout間隔を置いて同じクエリを自動的に実行しようとします。

したがって、秘訣は、トランザクションができるだけ短くなるようにすることです。つまり
、1.開始トランザクションを実行します
2.更新/削除/挿入
3.コミット

これらの 3 つのステップの間に他に何もありません。またsqlite3_busy_timeout、トランザクションの大きさに応じて、アプリケーションに合わせて間隔を広げてください。

WALSQLiteへの読み書きが同時にできるモードを試すことができます。しかし、それには独自の一連の欠点があります。SQLiteのドキュメントを参照できます。

于 2012-08-07T05:34:35.020 に答える
0

SQLiteには、複数のユーザーと複数のトランザクションに関していくつかの制限があります。つまり、異なるトランザクションからのリソースに対して読み取り/書き込みを行うことはできません。データベースが更新されると、データベースはロックされます。

ここにあなたを助けるかもしれないいくつかのリンクがあります


http://sqlite.org/c3ref/busy_timeout.html


http://www.sqlite.org/c3ref/busy_handler.html

幸運を

于 2012-08-06T19:59:23.157 に答える