> 백엔드 개발 > Golang > 내 Golang Sqlite3 코드에 'Database is Locked' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

내 Golang Sqlite3 코드에 'Database is Locked' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-11 15:19:19
원래의
774명이 탐색했습니다.

Why Does My Golang Sqlite3 Code Get a

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿