事务在数据库中是一个重要的概念,使用事务可以保证数据的统一和完整性。同时也可以提高效率。拿我们上面创建的persons表来说,假设我要一次插入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{
}