Sqlite3 오류 수정 방법: Golang에서 데이터베이스가 잠겨 있습니다
Golang에서 Sqlite3 데이터베이스로 작업할 때 오류가 발생할 수 있습니다. , "데이터베이스가 잠겨 있습니다." 이 오류는 여러 스레드가 동일한 데이터베이스 파일을 동시에 사용할 수 없음을 나타냅니다.
문제의 근본
프로그램에 단일 연결만 있고 닫을 수 있더라도 모든 쿼리 결과에도 불구하고 데이터베이스 파일에 대한 핸들이 여러 개 있을 수 있습니다. 이 문제는 Opendfileview 프로그램을 사용하여 확인할 수 있습니다.
여러 데이터베이스 파일 핸들을 생성하는 코드
다음 코드는 두 개의 데이터베이스 파일 핸들이 생성되는 방법을 보여줍니다.
import "log" import ( "database/sql" "fmt" ) func main() { database, tx, err := getDatabaseHandle() if err != nil { log.Fatal(err) } defer database.Close() dosomething(database, tx) } 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() // Missing defer if rows.Next() { ... } rows.Close() //some insert queries tx.Commit() } func getDatabaseHandle() (*sql.DB, *sql.Tx, error) { database, err := sql.Open("sqlite3", dbPath) if err != nil { fmt.Println("Failed to create the handle") return nil, nil, err } if err2 := database.Ping(); err2 != nil { fmt.Println("Failed to keep connection alive") return nil, nil, err } tx, err := database.Begin() if err != nil { return nil, nil, err } return database, tx, nil }
해결 방법
문제가 발생하면 아래와 같이 Row.Close() 호출을 연기할 수 있습니다.
if err != nil { return err } defer rows.Close() // Move defer here if rows.Next() { ... }
rows.Close() 호출을 연기하면 작업 중에 패닉이나 오류가 발생하더라도 행이 닫히도록 할 수 있습니다. 반복. 이렇게 하면 추가 데이터베이스 파일 핸들이 생성되는 것을 방지하고 "데이터베이스가 잠겼습니다" 오류를 해결하는 데 도움이 됩니다.
위 내용은 내 Golang Sqlite3 코드에 'Database is Locked' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!