2013-03-26 2 views
1

SqliteConnection BeginTransaction() 호출 발행 후 궁금한 점이 있었는데 예약 잠금이 작동하여 쓰기 차단을 시작합니까?Sqlite 트랜잭션 - 예약 잠금은 언제 효력을 발생합니까?

예약 잠금은 실제 BeginTransaction 호출에 해당합니까? 아니면 Commit이 호출되고 트랜잭션이 실행 된 후에 만 ​​사용합니까?

내 기존 데이터 액세스 계층을 활용하고 경쟁 조건을 방지하기 위해 필요할 때마다 사용자 정의 트랜잭션을 작성할 필요없이 b/c에게 문의하십시오. BeginTransaction()에 대한 호출을하지 않아도됩니다. 기존의 선택/삽입/업데이트 래퍼 조합을 호출하여 독점 쓰기 액세스 권한을 가진 상태에서 문제를 해결하고 마지막으로 커밋을 호출합니다. 피하려고하는 경쟁 조건을 방지하기 위해 트랜잭션의 예약 잠금이 BeginTransaction (즉, 반환되기 전 언젠가) 호출시 "즉시"활성 상태 여야합니다.

더 자세한 설명이 필요하면 알려 주시면 기꺼이 알려 드리겠습니다. 귀하의 전문 지식에 대해 친절하게 감사드립니다.

+0

이 답변은 여기에 있습니다 : http://sqlite.phxsoftware.com/forums/p/1157/4892.aspx는이 문제를 다루지 만 이것에 대한 다른 문서가 없기 때문에이 사실 또는 일부에 대한 일부 확인 그것에 관한 자세한 내용은 좋을 것입니다. 위에서 설명한 앞서 설명한 솔루션을 따라 진행하면 DAL을 크게 수정해야하므로 BeginTransaction/Commit에서 잠금이 작동하는 방법을 확신하고 싶습니다. 다시 한번 감사드립니다. – samosaris

답변

2

documentation는 말한다 :

데이터베이스에 대해 첫 번째 읽기 작업이 공유 잠금을 생성하고 첫 번째 쓰기 작업이 예약 된 잠금을 만듭니다.

모든 변경 사항이 페이지 캐시에 맞으면 COMMIT 중에 첫 번째 실제 쓰기 작업이 수행됩니다. BEGIN를 실행하는 잠금을 취할 SQLite는 강제로

, BEGIN IMMEDIATE로 거래를 시작

을 A가 IMMEDIATE BEGIN 후, 다른 데이터베이스 연결은 IMMEDIATE BEGIN 데이터베이스에 기록 할 수 없거나 할 것 또는 BEGIN EXCLUSIVE. 그러나 다른 프로세스는 데이터베이스에서 계속 읽을 수 있습니다.

읽기를 방지하려는 경우 (모든 트랜잭션이 어떤 경우에도 제대로 직렬화되기 때문에 필요하지는 않음) BEGIN EXCLUSIVE을 사용하십시오.

+0

이것은 좋은 소식입니다 ... 내 첫 "커스텀 트랜잭션"(정말로, 정말로 못생긴)을 작성한 후에 상황이 끔찍해 보였습니다. 나는 분명히 그것을 사이드 앱으로 테스트 할 것이지만,이 경쟁 조건이 거의 2 주 정도의 개발을 소비 했으므로 지금은 시간이 없다! 이 보석에 대해 너무 고마워. – samosaris

+0

CL. - "BEGIN IMMEDIATE"가 트랜잭션에서 사용되는 격리 수준이 무엇인지 궁금합니다. SqliteCommand 메서드 BeginTransaction()은 격리 수준을 매개 변수로 사용하며이 값은 트랜잭션이 사용할 잠금 모드를 결정합니다 (즉, BEGIN IMMEDIATE, BEGIN EXCLUSIVE, ...). 여기에 뭔가 빠진 게 아니라면, 고마워. ref : http://sqlite.phxsoftware.com/forums/t/1281.aspx – samosaris

+0

SQLite의 트랜잭션은 항상 직렬화 가능합니다. –

관련 문제