두 프로세스에서 사용하는 SQLite 데이터베이스가 있습니다. 최신 버전의 SQLite에서 한 프로세스 (연결)가 데이터베이스에 쓰기 위해 트랜잭션을 시작하는 동안 다른 프로세스가 데이터베이스에서 동시에 읽을 수 있는지 궁금합니다.
답변:
나는 주로 sqlite.org에서 다양한 출처에서 정보를 수집하여 함께 모았습니다.
첫째, 기본적으로 여러 프로세스가 동일한 SQLite 데이터베이스를 동시에 열 수 있으며 여러 읽기 액세스가 병렬로 충족 될 수 있습니다.
쓰기의 경우 데이터베이스에 대한 단일 쓰기는 짧은 시간 동안 데이터베이스를 잠그고 읽기는 물론 아무것도 데이터베이스 파일에 액세스 할 수 없습니다.
3.7.0 버전부터는 읽기와 쓰기를 동시에 진행할 수 있는 새로운 "Write Ahead Logging"(WAL) 옵션을 사용할 수 있습니다.
기본적으로 WAL은 활성화되지 않습니다. WAL을 켜려면 SQLite 문서를 참조하십시오.
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 ()에 대한 각 호출은 동일한 프로세스 내의 모든 이전 호출을 재정의합니다.