programing

SQLite3 및 여러 프로세스

cafebook 2023. 9. 20. 20:43
반응형

SQLite3 및 여러 프로세스

여러 프로세스가 하나의 SQLite 데이터베이스 파일에 액세스할 때 정확성을 보장하는 방법은 무엇입니까?

먼저 sqlite 데이터베이스 파일에 대한 동시 액세스를 방지합니다.동시성은 sqlite의 약점 중 하나이며 동시성이 높은 응용 프로그램이 있다면 다른 데이터베이스 엔진을 사용하는 것을 고려해 보십시오.

동시성을 피할 수 없거나 sqlite를 떨어뜨릴 수 없는 경우 쓰기 트랜잭션을 다음으로 감싸십시오.BEGIN IMMEDIATE;...END;. sqlite의 기본 트랜잭션 모드는DEFERRED즉, 첫 번째 실제 쓰기 시도 시에만 잠금이 획득됨을 의미합니다.와 함께IMMEDIATE거래, 잠금 장치가 즉시 획득되거나, 또는 당신은SQLITE_BUSY즉시누군가 데이터베이스에 대한 잠금을 유지할 경우, 다른 잠금 시도는SQLITE_BUSY.

상대하기SQLITE_BUSY스스로 결정해야 할 일입니다많은 애플리케이션의 경우, 1~2초 정도 기다렸다가 다시 시도하는 것이 꽤 효과적이며, 그 후에는 포기합니다.n실패한 시도이것을 쉽게 해주는 sqlite3 API 도우미가 있습니다.sqlite3_busy_handler()그리고.sqlite3_busy_timeout()수작업으로도 가능합니다.

OS 수준 동기화를 사용하여 데이터베이스에 대한 뮤텍스 잠금을 획득하거나, 하나의 스레드가 데이터베이스에 액세스할 때 OS 수준의 스레드 간/프로세스 간 메시지를 사용하여 신호를 보낼 수도 있습니다.

SQLite 프리미티브는 SQLITE_B를 반환합니다.USY가 데이터베이스에 접근하려고 할 경우 다른 프로세스가 동시에 접근하고 있습니다.해당 오류 코드를 확인하고 작업을 반복할 수 있습니다.

또는 MS Windows에서 OS 동기화(mutex)를 사용하거나 다른 OS에서 유사한 기능을 사용할 수도 있습니다.프로세스는 뮤텍스를 획득하려고 시도하고 다른 사람이 이미 뮤텍스를 보유하고 있는 경우 다른 프로세스가 작업을 완료하고 뮤텍스를 해제할 때까지 프로세스가 차단됩니다.프로세스에서 음소거 텍스트를 획득한 후 절대 해제하지 않는 경우가 발생하지 않도록 주의해야 합니다.

기본적으로 데이터 액세스 코드를 트랜잭션으로 래핑해야 합니다.이렇게 하면 데이터가 일관되게 유지됩니다.다른 것은 필요 없습니다.

사용 중인 SQLite

거래 시작

커밋 트랜잭션

쌍을 지정하여 트랜잭션을 구분합니다.SQL 코드를 한 번의 트랜잭션으로 실행하기 위해 그 사이에 삽입합니다.

하지만 이전에 저보다 먼저 말씀하신 것처럼 동시성 문제에 대해서는 세심한 주의가 필요합니다.SQLite는 읽기 액세스에 사용되는 경우 상당히 빠르게 작동할 수 있습니다(여러 개의 판독기가 차단되지 않고 동시에 실행될 수 있음).

그러나 코드가 쓰기 및 읽기 액세스 권한을 남겨두면 그림이 상당히 바뀝니다.SQLite를 사용하면 작성자가 한 명이라도 활성화된 경우 전체 데이터베이스 파일이 잠깁니다.

언급URL : https://stackoverflow.com/questions/1063438/sqlite3-and-multiple-processes

반응형