2013-07-13 2 views
2

마지막으로 추가 된 행 ID를 검색하는 일반적인 문제에 직면 해 있습니다. 문제는이 작업을 가능한 한 원자 적으로 전체 스레드로부터 안전하게 유지하기 위해서입니다. 나는 SQLite 주위에 ADO.NET wrapper을 사용한다.SQLite - 마지막 행의 ID 검색

  • SQLiteConnection 클래스는 마지막으로 성공한 삽입 작업의 RowId를 반환하는 LastInsertRowId 속성을 제공합니다

    내 연구이다. 그러나 어떤 스레드가 had enough luck 일 때 LastInsertRowId의 평가 중 일부 데이터를 테이블로 밀어 넣으면 일부 잘못된 ID를 얻을 수 있습니다 (대부분 내가 찾고있는 것 같지 않음).
  • SQLite는 AUTOINCREMENT 키를 생성하는 데 사용되는 값을 저장하는 sqlite_sequence이라는 테이블을 유지 관리합니다. 수동으로 값 중 하나를 증가시키고 미리 정의 된 Id 값을 가진 행을 삽입 할 수 있습니다 (저장 프로 시저를 사용하여 MySQL에서 이와 같은 작업을합니다). 문제는이 솔루션이 안전하기를 원한다면이 테이블, 증분 및 업데이트를 원자 프로세스로 구현해야하며이를 수행하는 방법을 모른다는 것입니다.
  • SQLite 용 Android API에 마지막으로 추가 한 행의 ID를 반환하는 insert 메서드가 포함되어 있지만 사용하는 래퍼에서 해당 메서드를 찾을 수 없습니다.

그래서 마지막으로 추가 한 행의 ID를 스레드 세이프 방식으로 에 기록하는 방법은 무엇입니까??

답변

2

우리가 처리하는 방식은 트랜잭션을 시작하고 삽입 또는 업데이트를 수행하고 SELECT last_insert_rowid() (결과 검색)을 실행 한 다음 트랜잭션을 커밋하는 것입니다.

이 속성은 트랜잭션 특성 및이 연산이 현재 연결에 대한 정보를 반환하므로 DB에 대한 다른 연결이 없으므로 원자 적이어야합니다.