事务处理是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的并发控制机制是采用加锁的方式,实现简单,也非常巧妙.