Sqlite3 を使用した Go の「データベースがロックされています」エラーについて理解する
Go で SQLite3 データベースを操作すると、「データベースがロックされています」というエラーが発生します」エラーは不可解な経験になる可能性があります。このエラーは通常、複数のスレッドが同じデータベース ファイルに同時にアクセスしようとしたときに発生します。ただし、プログラム内で接続を 1 つだけ取得すると述べたことは注目に値します。
問題をさらに調査したところ、すべてのクエリ結果を閉じたにもかかわらず、データベース ファイルの複数のハンドルが作成されたことが正しく特定されました。これは、Opendfileview プログラムを使用して確認できます。この問題を解決するには、提供されたコードを分析して問題の原因を特定しましょう。
getDatabaseHandle 関数は SQLite3 データベースへの接続を初期化し、トランザクションを開始します。作成されたデータベース ハンドルとトランザクションへのポインタを返します。 dosomething 関数内で、データベースに対してクエリを実行し、結果の行を閉じます。その後、トランザクション内でいくつかの挿入クエリを実行し、最終的にトランザクションをコミットします。
コードを調べると、rows.Close() 呼び出しが遅延されていないことがわかります。これにより、結果行が開いたままになり、追加のデータベース ハンドルが発生する可能性があります。以下に示すように、行クロージャを延期してみてください。
if err != nil { return err } defer rows.Close() if rows.Next() { ... }
行クロージャを延期することで、エラーが発生した場合でも結果の行は確実にクローズされます。これにより、関連するデータベース ハンドルが解放され、「データベースがロックされています」エラーが発生するのを防ぐことができます。
以上が接続が 1 つしかないにもかかわらず、Go プログラムで SQLite3 で「データベースがロックされています」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。