ホームページ >バックエンド開発 >Golang >Go で SQLite3 データベース ロックを回避するには?

Go で SQLite3 データベース ロックを回避するには?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 20:53:101006ブラウズ

How to Avoid SQLite3 Database Locks in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。