여러 연결에서 동시에 SQLite 데이터베이스를 읽고 쓸 수 있습니까?


87

두 프로세스에서 사용하는 SQLite 데이터베이스가 있습니다. 최신 버전의 SQLite에서 한 프로세스 (연결)가 데이터베이스에 쓰기 위해 트랜잭션을 시작하는 동안 다른 프로세스가 데이터베이스에서 동시에 읽을 수 있는지 궁금합니다.


관련 질문은 .. 여기에서 볼 stackoverflow.com/questions/12117016/...
AndroidGeek

답변:


142

나는 주로 sqlite.org에서 다양한 출처에서 정보를 수집하여 함께 모았습니다.

첫째, 기본적으로 여러 프로세스가 동일한 SQLite 데이터베이스를 동시에 열 수 있으며 여러 읽기 액세스가 병렬로 충족 될 수 있습니다.

쓰기의 경우 데이터베이스에 대한 단일 쓰기는 짧은 시간 동안 데이터베이스를 잠그고 읽기는 물론 아무것도 데이터베이스 파일에 액세스 할 수 없습니다.

3.7.0 버전부터는 읽기와 쓰기를 동시에 진행할 수 있는 새로운 "Write Ahead Logging"(WAL) 옵션을 사용할 수 있습니다.

기본적으로 WAL은 활성화되지 않습니다. WAL을 켜려면 SQLite 문서를 참조하십시오.


따라서 가정적으로 일반 대중이 데이터에 액세스 할 수 있도록하지 않고 로컬에서 데이터를 원하지만 여러 파일을 병렬로 쓸 수있는 문제를 해결해야하는 경우 여러 쓰기가 동시에 발생할 수 있도록 해당 쓰기 당 하나의 데이터베이스 파일이 필요합니다. 맞나요? 나는 여러 파일이 일반적으로 눈살을 찌푸리고 있다는 것을 알고 있지만 로컬 계산에만 데이터가 필요하기 때문에 서버 측 데이터베이스를 사용하지 않고 셀러리 작업에서 여러 쓰기를 수행하는 방법을 찾으려고 노력하고 있습니다
PirateApp

이 기능을 방지하려는 경우 데이터베이스를 단일 프로세스로 잠그는 데 사용할 수 있는 pragma, locking_mode = exclusive 가 있습니다.
Scovetta

20

SQLite3는 명시 적으로 다중 연결을 허용 합니다 .

(5) 여러 응용 프로그램 또는 동일한 응용 프로그램의 여러 인스턴스가 단일 데이터베이스 파일에 동시에 액세스 할 수 있습니까?

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

연결을 공유하려면 SQLite3 공유 캐시를 사용하십시오 .

3.3.0 버전부터 SQLite는 특별한 "공유 캐시"모드를 포함합니다 ( 기본적으로 비활성화 됨 ).

버전 3.5.0에서 공유 캐시 모드는 단일 스레드 내에서가 아닌 전체 프로세스에서 동일한 캐시를 공유 할 수 있도록 수정되었습니다.

5.0 공유 캐시 모드 활성화

공유 캐시 모드는 프로세스별로 활성화됩니다. C 인터페이스를 사용하면 다음 API를 사용하여 공유 캐시 모드를 전역 적으로 활성화 또는 비활성화 할 수 있습니다.

int sqlite3_enable_shared_cache (int);

각 호출 sqlite3_enable_shared_cache ()는 sqlite3_open (), sqlite3_open16 () 또는 sqlite3_open_v2 ()를 사용하여 생성 된 후속 데이터베이스 연결에 영향을줍니다. 이미 존재하는 데이터베이스 연결은 영향을받지 않습니다. sqlite3_enable_shared_cache ()에 대한 각 호출은 동일한 프로세스 내의 모든 이전 호출을 재정의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.