2016-12-14 5 views
1

저는 SQLite 데이터베이스와 작동하는 C++ 소프트웨어를 쓰고 있습니다.거래를 지우십시오.

많은 잠재적 인 분기 및 오류가있는 코드의 한 섹션이 있습니다. 내 거래가 항상 커밋되거나 롤백되는 것을 확인하는 데 문제가 있습니다.

"진행중인 트랜잭션이있는 경우 롤백 할 방법이 있는지 궁금합니다." 또는 거래가 유효한지 판단하기 위해 할 수있는 테스트가 있습니까?

아무런 조치가 없으므로 트랜잭션이 적용되지 않을 때 ROLLBACK을 실행하면 오류가 발생합니다. 하지만 방금 물어볼 줄 알았다.

답변

1

많은 언어는 try/finally 구조를 가지고 있습니다. 당신이 대신 생성자/소멸자와 객체와 RAII를 사용할 필요가 없습니다했다 ++ C : 트랜잭션이 FUL success 경우

class Transaction { 
    sqlite3* db; 
    public Transaction(sqlite3* db): db(db) 
    { 
     sqlite3_exec(db, "BEGIN"); 
    } 
    public ~Transaction() 
    { 
     if (success) 
      sqlite3_exec(db, "COMMIT"); 
     else 
      sqlite3_exec(db, "ROLLBACK"); 
    } 
}; 

당신은 안드로이드의 setTransactionSuccessful() 같은 기능을 사용할 수 있습니다, 확인하려면 (또한 beginTransaction() 참조).

그리고 약간의 오류 처리가 유용합니다 (특히 COMMIT을 시도 할 때 SQLITE_BUSY).

(실제로는 명시 적 트랜잭션, 당신은, test for auto-commit mode 수 활성화되어 있지만 트랜잭션이 제대로 처리되도록 보장하기 위해 더 나은 방법이 있다면 이렇게하지 여부를 확인합니다.)