2017-09-13 1 views
0

내가 (그리고 아마도 WAL) SQLite는 VACUUM에 대한 두 가지 질문을했습니다에서 열 성공하려면?SQLite는 VACUUM는 여러 프로세스

• 왜 VACUUM은 효과가 없지만 (공간 재 확보 없음) Sqlite가 SQLITE3_OK를 반환합니까? 나는이 개 과정에 액세스 WAL 모드에서 데이터베이스를했습니다

:

은 내 문제에 대한 자세한 내용을 비트. 어떤 시점에서 사용자는 데이터베이스에서 데이터를 삭제할 수 있습니다. 데이터베이스는 여러 프로세스에서 열 수 있으므로 레코드를 삭제 한 다음 VACUUM을 실행하여 연결을 닫고 파일을 삭제하는 대신 디스크 공간을 회수합니다.

문제는 2 개의 프로세스가 DB 연결이 열렸을 때 프로세스 중 하나의 VACUUM이 확인을 반환하지만 실제로 공간을 회수하지 않는다는 것입니다.

나는 어떤 프로세스에서 미해결 SQL 문이있을 때까지 VACUUM이 성공하지 않는다고 생각한다. 문제는 두 프로세스가 서로를 인식하도록하고 싶지 않다는 것입니다.

내가 고려중인 것은 두 프로세스 모두에서 VACUUM을 수행하는 것이므로 마지막으로 (데이터를 삭제하라는 사용자 요청시) 연결을 마지막으로 종료하는 것이 공간 교정을 담당합니다. 또한 auto_vacuum을 고려하고 (나는 그것의 한계를 알고 있지만, h 제가이 데이터베이스에 매우 자주하지

답변

0

documentation는 말한다.

진공은 열려있는 트랜잭션이있는 경우 실패 할 경우, 또는 것

다른 종류의 데이터베이스 수정과 마찬가지로 쓰기 가능한 트랜잭션은 다른 읽기 또는 쓰기 트랜잭션이 활성화되어 있지 않아야하며, 일반적으로 모든 명령문이 재설정 또는 최종 화됨

WAL 모드에서 쓰기 트랜잭션이 다른 읽기 트랜잭션에 의해 차단되지는 않지만 이전 데이터를 유지해야합니다. 진공 이외에 initiate a truncate checkpoint을 사용해야합니다.


가장 쉬운 방법은 VACUUM을 전혀 실행하지 않는 것입니다. 여유 공간은 나중에 재사용됩니다.

+0

진공 호출로 인해 SQLite 오류가 발생하지 않는 이유는 여전히 흥미로울 것입니다. –

+0

SQLite_OK를 반환하면 실제로는 진공 상태가됩니다. –

+0

디스크의 파일 크기는 동일하게 유지되지만 여러 번 검사했습니다. –