2013-07-20 2 views
2

우리는 SQLite 데이터베이스에서 매우 큰 트랜잭션을 수행하여 WAL 파일이 매우 커질 수 있습니다. (대용량 트랜잭션의 경우 최대 1GB 가끔 나타납니다.) 트랜잭션 도중에 WAL 파일을 체크 포인트 할 수 있습니까? sqlite3_wal_checkpoint()을 호출하거나 WAL 체크 포인트 PRAGMA 문을 실행하면 SQLITE_BUSY가 반환됩니다.트랜잭션 중에 WAL 파일을 체크 포인트 할 수 있습니까?

답변

4

아니요. 이것은 트랜잭션의 전체 지점입니다. WAL (또는 저널 파일)은 성공적으로 커밋 된 데이터를 공식적으로 유지합니다. 그 때까지 프로그램 크래시, 컴퓨터 재부팅 등의 문제가 발생하면 WAL 또는 저널 파일을 사용하여 커밋되지 않은 작업을 안전하게 롤백 (실행 취소) 할 수 있습니다. 이 커밋되지 않은 트랜잭션의 일부만 이동하면이 목적을 무효화합니다.

SQLite 문서는 체크 포인팅을 moving the WAL file transactions back into the database으로 정의합니다. 즉, 검사 점 지정은 하나 이상의 트랜잭션을 WAL에서 이동하지만 큰 커밋되지 않은 트랜잭션의 일부는 이동하지 않습니다. - 당신이 할 수있는 경우 작은 청크에 커밋

  • 은 큰 거래를 피하십시오 :

    이 문제에 대한 몇 가지 가능한 해결 방법이 있습니다. 물론 응용 프로그램에 따라 항상 가능한 것은 아닙니다.

  • PRAGMA journal_mode=DELETE과 함께 오래된 저널링 모드를 사용하십시오. 새로운 WAL 모드 (PRAGMA journal_mode=WAL)보다 약간 느리지 만 제 경험상 훨씬 작은 저널 파일을 만드는 경향이 있으며 트랜잭션이 성공적으로 커밋되면 삭제됩니다. 예를 들어, Android 4.x는 여전히 이전 저널링 모드를 사용하고 있습니다. 플래시에서 더 빠르게 작동하는 경향이 있으며 거대한 임시 또는 저널 파일을 생성하지 않습니다.
+0

불행히도 우리 애플리케이션에서는 트랜잭션을 더 작은 트랜잭션으로 청크 처리 할 수 ​​없습니다. 이것은 내가 예상했던 대답 이었지만 대규모 트랜잭션 중에 WAL 파일을 작게 유지할 수있는 구현하기 쉬운 기법이 있기를 바랬습니다. 그래도 고마워! – zanneth

관련 문제