【问题标题】:Is it mandatory to use "END TRANSACTION" in sqlite在sqlite中是否必须使用“END TRANSACTION”
【发布时间】:2014-10-24 07:11:04
【问题描述】:

在我的 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); 插入速度变慢时,我的问题是,使用“BEGIN TRANSACTION”后是否必须使用“END 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?

【问题讨论】:

    标签: ios iphone sqlite transactions bulkinsert


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多