Go での SQLite3 データベース ロック
Go で SQLite3 データベースを操作する場合、開発者は「データベースがロックされています」エラーが発生することがあります。これは通常、複数のスレッドが同じデータベース ファイルに同時にアクセスしようとしたときに発生します。ただし、コード内で接続が 1 つだけ確立されている場合でも、追加のデータベース ファイル ハンドルを作成できます。
提供されたコード例では、データベース ハンドルが 2 回作成されます。まず getDatabaseHandle 関数内で、次に dosomething 関数内で再度実行します。これにより、複数のデータベース ファイル ハンドルが同時に開かれ、「データベースがロックされています」エラーが発生する可能性があります。
この問題を解決するには、defer を使用してクエリ結果のクローズを延期します。コード例では、dosomething 関数を次のように変更します。
func dosomething(database *sql.DB, tx *sql.Tx) error { rows, err := database.Query("select * from sometable where name=?", "some") if err != nil { return err } defer rows.Close() // Defer closing the query results if rows.Next() { ... } // some insert queries tx.Commit() }
クエリ結果のクローズを延期することで、Go は関数が終了すると自動的にクエリ結果を閉じ、データベース ファイル ハンドルが適切に解放されるようにします。
以上がGo で SQLite3 データベース ロックを回避するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。