次のようなクエリを実行しています。
ATTACH 'db2' as db;
BEGIN TRANSACTION;
...
END TRANSACTION;
トランザクションに添付するのはエラーなので、このようにする必要があります。
上記のクエリが発行されたときに別の接続がすでに何らかのクエリを実行している場合、問題が発生するようです。次に、クエリ全体が失敗したように見え、SQLITE_BUSYを返します。
これを処理するために、しばらくスリープしてからトランザクションを再試行します。ただし、「トランザクション内にデータベースを接続できません」というエラーが表示されます。なぜこうなった?SQLITE_BUSYを返しても、元のアタッチは成功しましたか?もしそうなら、なぜ私は代わりに「データベースdb2はすでに使用されています」を取得しなかったのですか?または、SQLITE_BUSYが返されたにもかかわらず、前のトランザクションはまだ開いていますか?それは私には意味がありません。クエリはビジーで失敗したので、トランザクションが開かれるべきではありませんでした。しかし、他に何ができるでしょうか?
一般に、クエリを実行するプログラムは、クエリが何であるかを認識していません。これは、一種のラッパーにすぎません。したがって、クエリを2つの部分に分割するようなことはできません。1つはデータベースを接続するためのもので、もう1つは残りのクエリを実行するためのものです。しかし、これがとにかく問題であるかどうかはわかりません。