是否必须使用" END TRANSACTION"在sqlite中

时间:2014-10-24 07:11:05

标签: ios iphone sqlite transactions bulkinsert

在我的ios应用程序中,我使用for循环将大量数据插入sqlite,因为我使用的插入非常慢

 sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0); 

使用上面的语句后插入变得非常快,现在添加后

sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);插入再次变慢,

当我仅使用sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);插入时更快,当我添加sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);插入变得更慢时,我的问题是,是否必须使用" END TRANSACTION"使用" BEGIN TRANSACTION" ?我只能使用sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);,因为只有Begin语句

才能更快地插入

以下是我的代码

BOOL success = TRUE;
    sqlite3_stmt *addStmt;

    const char *strStyleInsertQuery = "insert or replace into tbl (id,hole_number,par,distance,delete_flag,course_id) values (?,?,?,?,?,?)";

    NSUInteger intCount = [arrHoles count];
    sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);
    for (int i = 0; i < intCount; i++)
    {
        if(sqlite3_prepare_v2(dbh,strStyleInsertQuery, -1, &addStmt, NULL) == SQLITE_OK)
        {

            if([[arrHoles objectAtIndex:i] objectForKey:@"handicap"] == nil || [[[arrHoles objectAtIndex:i] objectForKey:@"handicap"] isKindOfClass:[NSNull class]])
                sqlite3_bind_text(addStmt, 7, [@"" UTF8String], -1, SQLITE_TRANSIENT);
            else
                sqlite3_bind_text(addStmt, 7, [[NSString stringWithFormat:@"%d",[[[arrHoles objectAtIndex:i] objectForKey:@"handicap"] intValue]] UTF8String], -1, SQLITE_TRANSIENT);

        }
        if(SQLITE_DONE != sqlite3_step(addStmt))
        {
            success = FALSE;
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(dbh));
        }
        //Reset the add statement.
        sqlite3_reset(addStmt);
    }
    sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);   //IS THIS MANDATORY?

1 个答案:

答案 0 :(得分:1)

当你既不使用BEGIN也不使用END时,数据库将为每个语句使用自动事务,这很慢。

当您同时使用BEGIN和END时,事务中完成的所有更改都将写入磁盘并与END同步。

当您使用BEGIN但不使用END时,事务中所做的更改将不会写入磁盘。 这肯定比使用END更快,但会对数据库中数据的正确性产生负面影响。

相关问题