SQLite 데이터베이스 잠금을 어떻게 방지합니까?


11

SQLite FAQ에서 다음을 알고 있습니다.

여러 프로세스가 동시에 동일한 데이터베이스를 열 수 있습니다. 여러 프로세스가 동시에 수행 될 수 있습니다 SELECT. 그러나 한 번에 하나의 프로세스 만 데이터베이스를 변경할 수 있습니다.

그래서, 지금까지 나는 내가 할 수있는 이해 : 1) 읽기 여러 스레드에서 데시벨 ( SELECT) 여러 스레드 2) 읽기 데시벨 ( SELECT단일 스레드에서)와 쓰기 ( CREATE, INSERT, DELETE)

그러나 독자가 작성자를 차단하지 않고 작성자가 독자를 차단하지 않기 때문에 동시성을 제공하는 Write-Ahead Logging 에 대해 읽었습니다 . 읽기와 쓰기가 동시에 진행될 수 있습니다.

마지막으로, 나는 그것을 발견했을 때 완전히 혼란 스럽다 .

SQLITE_LOCKED 오류가 발생하는 다른 이유는 다음과 같습니다.

  • 에 시도 CREATE또는 DROP잠시 테이블이나 인덱스 SELECT문이 아직 보류 중입니다.
  • a SELECT가 동일한 테이블에서 활성화되어 있는 동안 테이블에 쓰려고 합니다.
  • SELECTsqlite가 설정되지 않은 경우 멀티 스레드 응용 프로그램에서 동일한 테이블에서 동시에 두 가지 작업을 시도합니다 .
  • fcntl (3, F_SETLK DB 파일 호출 실패. 예를 들어 NFS 잠금 문제로 인해 발생할 수 있습니다.이 문제에 대한 한 가지 해결책은 DB를 mv로 제거한 다음 다시 복사하여 새로운 Inode 값을 갖도록하는 것입니다.

그래서, 나는 스스로를 분명히하고 싶습니다. 자물쇠를 피해야합니까? 두 개의 다른 스레드에서 동시에 읽고 쓸 수 있습니까? 감사.

답변:


9

당신이 링크 한 그 페이지는 꽤 오래된 것 외에도 같은 데이터베이스 연결을 통해 (또는 사용하지 않아야하는 공유 캐시 모드의 다중 연결을 통해) 같은 프로세스에서의 액세스에 대해 이야기합니다 .

WAL 모드가 아닌 경우 여러 연결이 동일한 데이터베이스에서 읽을 수 있지만 쓰기 트랜잭션은 독점적입니다. 즉, 다른 독자 나 작성자는 허용되지 않습니다.

WAL 모드에서 작가와 독자는 서로를 차단하지 않지만 여전히 한 명의 작가 만 허용됩니다.


1
공유 캐시 모드에 어떤 문제가 있습니까? joblb Parallel for loop 를 통해 테이블에 쓰기 위해 동일한 프로세스에서 여러 파이썬 스레드를 얻을 수있었습니다 . isolation_level=None그래도 세트까지 잠금 문제가있었습니다 . 공유 캐시 모드가 없으면 스레드간에 인스턴스를 어떻게 공유합니까?
저스틴 친애하는

1
이 문서는 단점을 설명합니다. 교착 상태를 피하는 방법을 모르면 특히 위험합니다.
CL.

파티에 늦게 오지만이 링크는 유용합니다. manski.net/2012/10/sqlite-performance
infocyde
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.