0

次のようなクエリを実行しています。

ATTACH 'db2' as db;
BEGIN TRANSACTION; 
...
END TRANSACTION;

トランザクションに添付するのはエラーなので、このようにする必要があります。

上記のクエリが発行されたときに別の接続がすでに何らかのクエリを実行している場合、問題が発生するようです。次に、クエリ全体が失敗したように見え、SQLITE_BUSYを返します。

これを処理するために、しばらくスリープしてからトランザクションを再試行します。ただし、「トランザクション内にデータベースを接続できません」というエラーが表示されます。なぜこうなった?SQLITE_BUSYを返しても、元のアタッチは成功しましたか?もしそうなら、なぜ私は代わりに「データベースdb2はすでに使用されています」を取得しなかったのですか?または、SQLITE_BUSYが返されたにもかかわらず、前のトランザクションはまだ開いていますか?それは私には意味がありません。クエリはビジーで失敗したので、トランザクションが開かれるべきではありませんでした。しかし、他に何ができるでしょうか?

一般に、クエリを実行するプログラムは、クエリが何であるかを認識していません。これは、一種のラッパーにすぎません。したがって、クエリを2つの部分に分割するようなことはできません。1つはデータベースを接続するためのもので、もう1つは残りのクエリを実行するためのものです。しかし、これがとにかく問題であるかどうかはわかりません。

4

1 に答える 1

0

なぜこれが起こっているのか正確にはわかりませんが、SQLITE_BUSYが返された後にsqlite3_close()を呼び出してからsqlite3_open()を呼び出すのが十分な解決策であることがわかりました。これにより、前のクエリを再試行するとつまずく可能性のある未解決の状態がすべて取り除かれます。

于 2012-06-12T20:37:34.073 に答える