2010-01-12 6 views
4

몇개의 스레드 (3-4)가 접근하는 sqlite3 데이터베이스가 있습니다. 나는 동시성에 관해서는 http://www.sqlite.org/faq.html#q6라고 말한 sqlite3의 일반적인 한계에 대해 알고 있지만 문제가 아닌 것으로 확신한다.sqlite3 '데이터베이스 잠김'재시도없이 사라지지 않을 것입니다.

이 데이터베이스에서 읽고 쓰는 모든 스레드 모두. 나는 쓰기를 할 때마다, 나는 다음과 같은 구조가 : 나는 심지어이 블록에 충돌하지 않습니다, 일부 실행에

  try: 
       Cursor.execute(q, params) 
       Connection.commit() 
      except sqlite3.IntegrityError: 
       Notify 
      except sqlite3.OperationalError: 
       print sys.exc_info() 
       print("DATABASE LOCKED; sleeping for 3 seconds and trying again") 
       time.sleep(3) 
       Retry 

을하지만, 내가 할 때, 그것에서 나오는 결코 (계속 재 시도,하지만 난 계속 exc_info에서 '데이터베이스가 잠겨 있습니다'오류가 발생합니다. 리더/라이터 잠금 사용법을 올바르게 이해했다면 대기 중 일부가 경합에 도움이됩니다. 교착 상태가 발생하지만 코드에서 트랜잭션을 사용하지 않습니다. 모든 SELECT 또는 INSERT는 단지 하나의 해제입니다. 그러나 일부 스레드는 작업을 수행 할 때 동일한 연결을 유지합니다 (SELECTS 및 INSERT와 다른 수정 자의 혼합 포함).

만약 가능하다면 나는 그것을 apericiate 것입니다 이것에 빛을 비추다. (다른 데이터베이스 엔진을 사용하는 것 외에는) 고정 방법도 있습니다.

+0

이 문제를 보여주는 매우 작은 분리 된 테스트 사례를 구축 할 수 있습니까? 실행 가능한 코드가 있고 전체를 볼 수 있다면 더 쉬울 것입니다. – Dustin

+0

안녕 더스틴, 더 큰 코드 기반으로도 재현하기가 힘들어 실제로 실제로 어려울 수도 있습니다. 나는 이것이 일반적인 문제인지 그리고 sqlite3에 알려진 교착 상태 문제가 있는지 궁금해했다. 나는 그다지 우아하지 않은 수정을 게시 할 것이다. – BME

답변

0

Sqlite는 데이터베이스에 쓸 때마다 전체 데이터베이스를 잠급니다. 스레드 중 하나가 끊임없이 글을 쓸 가능성이 있습니까? 하나의 스레드가 데이터베이스 잠금을 누르거나 모두 하나만 사면됩니까?

+0

안녕 tamulj, 스레드가 끊임없이 쓰는 것은 아닙니다 (스레드는 이벤트 처리기를 기반으로 작성하며 한 번에 몇 행 이상이 아닙니다). – BME

0

내부의 sqlite 잠금에 의존하지 않고 외부 단독 잠금을 사용하여 쓰기를 사용합니다. 위의 블록은 기본적으로 모든 쓰레드가 쓰여지기 전에 획득해야하는 시스템 와이드 락 (system wide lock)으로 싸여 있습니다. 어쨌든 sqlite3은 전체 DB를 잠그기 때문에이 작업이 오버 헤드를 추가하지 않기를 바랍니다. 한편

, 나는 덜 제한적인 독자 잠금 sqlite3를 필요로하는 작업 확인을 생각 잠금을 획득하지 않고 진행할 수 있습니다 읽습니다.

0

나는 하루에 약 200 명의 사용자가있는 웹 사이트 (1000 페이지 뷰로 바뀌 었음)에서도이 문제를 겪었습니다. 재시도가 도움이되지 못했습니다 (그리고 마침내 그 사이에 짧은 잠과 함께 최대 100 개의 숫자가 증가했습니다). SQLite의 버전을 기억하지 못합니다. 그러나 SQLite 데이터베이스에 안정적으로 동시 쓰기를 원한다면 MySQL 또는 PostgreSQL과 같은 다른 데이터베이스를 사용하는 것이 더 좋습니다.

OperiteError-s를 사용하여 문제를 해결하더라도 결과는 SQLite 파일에 동시에 기록되므로 성능이 저하 될 수 있습니다.

관련 문제