2011-06-13 3 views
0

SQLite 사용에 대해 조사하기 시작했습니다. 내가 (다른 것들 중에서)하고 싶은 것은 일종의 체크 아웃 의미를 구현하고있다. 즉 하나의 SQL 연결이 한 열 또는 행에 대해 체크 아웃 잠금을 만드는 경우 문제가되지 않습니다. 첫 번째 연결이 잠금을 해제하거나 첫 번째 연결이 닫히거나 응용 프로그램 크레이 어 등이 끝날 때까지 해당 데이터를 읽거나 수정할 수있는 다른 연결을 허용하고 싶지 않습니다.SQLite 및 체크 아웃 의미

SQLite에서 구현할 수 있습니까?

/미리 감사드립니다.

답변

0

데이터베이스는 일반적으로 체크 아웃 의미를 실제로 지원하지 않습니다. 데이터베이스는 트랜잭션 격리를 보장하지만 트랜잭션 성공을 보장하지 않기 때문에 다른 트랜잭션이 방금 수정 한 (아직 커밋하지 않은) 오래된 트랜잭션 버전의 데이터로 다른 트랜잭션을 진행할 수 있으며 실제로 트랜잭션이 비 직렬화 가능하게 될 경우 , 그냥 뒤로 굴려 라. 잠금을 사용하더라도 여전히 명시 적으로 지원하지 않습니다. 행을 읽으면 읽기 잠김 상태가되고 쓰기를하면 쓰기 잠금 상태가되지만 그 위에 대한 제어권이 없습니다.

특히 Sqlite는 WAL 모드가 아니면 트랜잭션에서 쓰기를 시작할 때 전체 데이터베이스를 잠급니다. begin 대신 begin immediate을 사용하여 트랜잭션을 시작하여 잠금을 강제로 적용 할 수 있습니다. 그러나 WAL 모드에서는 일종의 동시성을 지원합니다. 불행하게도 나는 정확한 모드를 모른다.

어쨌든 당신은 아마도 스스로 체크 아웃 의미를 구현해야 할 것입니다. 또는 체크 아웃 의미가 부실 체크 아웃을 처리해야하므로 매우 복잡하기 때문에이 작업을 수행하지 않아도됩니다.

1

SQLite는 실제로 동시성이 너무 높게 설계되지 않았습니다. 잠금 모델은 데이터베이스 수준에서 잠글 수 있습니다. 레코드 레벨 잠금이 필요한 경우 (주로 그렇지 않음) 서버 기반 RDBMS가 필요합니다.

+0

+1 SQLite는 주로 모바일 앱, 데스크톱 앱, 임베디드 시스템 등과 같이 단일 사용자 시스템 (한 번에 소수의 사용자 만) 용으로 설계되었습니다 ... –

+0

쓰기에서 3.7.0+에 해당하지 않음 - 이전 로그 (WAL) 모드. 모든 유스 케이스에서 해당 모드를 사용할 수는 없습니다. –