몇개의 스레드 (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 것입니다 이것에 빛을 비추다. (다른 데이터베이스 엔진을 사용하는 것 외에는) 고정 방법도 있습니다.
이 문제를 보여주는 매우 작은 분리 된 테스트 사례를 구축 할 수 있습니까? 실행 가능한 코드가 있고 전체를 볼 수 있다면 더 쉬울 것입니다. – Dustin
안녕 더스틴, 더 큰 코드 기반으로도 재현하기가 힘들어 실제로 실제로 어려울 수도 있습니다. 나는 이것이 일반적인 문제인지 그리고 sqlite3에 알려진 교착 상태 문제가 있는지 궁금해했다. 나는 그다지 우아하지 않은 수정을 게시 할 것이다. – BME