문제

나의 SQLite기반 애플리케이션은 현재 롤백 및 성능 향상을 위해 트랜잭션을 사용합니다.모든 거래를 저장점으로 바꾸는 것을 고려하고 있습니다.그 이유는 애플리케이션이 멀티스레드이기 때문입니다(예, sqlite 스레드로부터 안전하도록 구성됨), 어떤 경우에는 동시에(동일한 DB에서) 두 스레드에 의해 트랜잭션이 시작될 수 있습니다.

  1. 그렇게 하지 않을 이유가 있나요?
  2. 제가 알아야 할 함정이 있나요?
  3. 그냥 교체할까 BEGIN, COMMIT, ROLLBACK ~와 함께 SAVEPOINT xyz, RELEASE SAVEPOINT xyz, ROLLBACK TO SAVEPOINT xyz?
도움이 되었습니까?

해결책

    It there a reason NOT to do it?

예.그것은 당신이 설명한 문제를 해결하지 못할 것입니다.저장 지점은 주로 데이터의 부분 롤백을 수행하는 데 사용됩니다.외부 트랜잭션 또는 저장점은 실제로 커밋됩니다.가장 바깥쪽 저장점이 해제되어 DB가 업데이트될 때까지 실제로는 아무것도 완전히 저장되지 않습니다.표준 트랜잭션에서 겪었던 것과 동일한 문제가 바로 다시 발생합니다.

    Are there any pitfalls I need to be aware of?

예.다중 스레드 애플리케이션의 트랜잭션이나 저장점은 문제의 핵심이라고 생각하는 두 개의 서로 다른 스레드에서 동일한 데이터를 업데이트하는 경우 상당히 쉽게 교착 상태에 빠질 수 있습니다.이 점에 있어서는 둘 사이에 차이가 없습니다.각 스레드에서 업데이트하는 내용을 파악하고 이에 따라 동기화해야 합니다.

간단히 말해서 부분 트랜잭션 롤백을 수행할 필요가 없는 한 저장점은 실제로 많은 것을 제공하지 않습니다(이름이 지정된다는 사실 제외).

여기에는 은총알이 없습니다.여러 스레드에서 업데이트될 수 있는 애플리케이션과 데이터를 진지하게 분석하고 필요한 경우 애플리케이션에 일부 동기화를 추가해야 할 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top