事務處理是DBMS中最關鍵的技術,對SQLite也一樣,它涉及到并發控制,以及故障恢復等等。在數據庫中使用事務可以保證數據的統一和完整性,同時也可以提高效率。假設需要在一張表內一次插入20個人的名字才算是操作成功,那么在不使用事務的情況下,如果插入過程中出現異常或者在插入過程中出現一些其他數據庫操作的話,就很有可能影響了操作的完整性。所以事務可以很好地解決這樣的情況,首先事務是可以把啟動事務過程中的所有操作視為事務的過程。等到所有過程執行完畢后,我們可以根據操作是否成功來決定事務是否進行提交或者回滾。提交事務后會一次性把所有數據提交到數據庫,如果回滾了事務就會放棄這次的操作,而對原來表的數據不進行更改。
SQLite中分別以BEGIN、COMMIT和ROLLBACK啟動、提交和回滾事務。見如下示例:
? ?@try{
? ? ? ?char *errorMsg;
? ? ? ? if (sqlite3_exec(_database, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK) {
? ? ? ? ? ? ? NSLog(@”啟動事務成功”);
? ? ? ? ? ? ? sqlite3_free(errorMsg);
? ? ? ? ? ? ? sqlite3_stmt *statement;
? ? ? ? ? ? ? if (sqlite3_prepare_v2(_database, [@"insert into persons(name) values(?);" UTF8String], -1, &statement, NULL)==SQLITE_OK) {
? ? ? ? ? ? ?//綁定參數
? ? ? ? ? ? ?const char *text=[@”張三” cStringUsingEncoding:NSUTF8StringEncoding];
? ? ? ? ? ? ?sqlite3_bind_text(statement, index, text, strlen(text), SQLITE_STATIC);
? ? ? ? ? ? ?if (sqlite3_step(statement)!=SQLITE_DONE) {
? ? ? ? ? ? ? ? ?sqlite3_finalize(statement);
? ? ? ? ? ? ?}
? ? ? }
? ? ? if (sqlite3_exec(_database, "COMMIT", NULL, NULL, &errorMsg)==SQLITE_OK) {
? ? ? ? ? ?NSLog(@”提交事務成功”);
? ? ? ?}
? ? ? ? sqlite3_free(errorMsg);
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? sqlite3_free(errorMsg);
? ? ? ? }
? ?}
? ? @catch(NSException *e){
? ? ? ? char *errorMsg;
? ? ? ? if (sqlite3_exec(_database, "ROLLBACK", NULL, NULL, &errorMsg)==SQLITE_OK) {
? ? ? ? ? ? NSLog(@”回滾事務成功”);
? ? ? ? }
? ? ? ? sqlite3_free(errorMsg);
? ?}
? ?@finally{
? ?}
Page Cache之并發控制
pager層是SQLite實現最為核心的模塊,它具有四大功能:I/O、頁面緩存、并發控制和日志恢復。而這些功能不僅是上層Btree的基礎,而且對系統的性能和健壯性有至關重要的影響。其中并發控制和日志恢復是事務處理實現的基礎。SQLite并發控制的機制非常簡單——即封鎖機制;另外,它的查詢優化機制也非常簡單——基于索引。這一切使得整個SQLite的實現變得簡單,同時變得很小,保證其運行速度非常快,所以特別適合嵌入式設備。SQLite是基于鎖來實現并發控制的,其鎖機制實現得非常簡單而巧妙。
SQLite的并發控制機制是采用加鎖的方式,實現簡單,也非常巧妙.