菜单

SQLite事务处理

2018年11月17日 - sqlite

应用程序初始化时用批量底向sqlite中插入大量多少,单独的行使for+Insert方法导致应用响应慢,因为
sqlite插入数据的下默认一修告句子就是一个作业,有多少条数就是发出多少坏磁盘操作。我之动起来5000长达记下为就是一旦5000不善读写磁盘操作。

事务处理是DBMS中不过要紧之技能,对SQLite也一如既往,它事关到出现控制,以及故障恢复等等。在数据库被运用工作可以保证数据的合并与完整性,同时也可提高效率。假设需要在同样摆设表内一潮栽入20个人的讳才终于操作成,那么在未采取工作之场面下,如果插入过程中冒出异常要以插入过程遭到出现有其他数据库操作的话,就充分有或影响了操作的完整性。所以工作可以充分好地解决这样的情形,首先事务是足以把启动工作进程遭到之持有操作视为事务之历程。等及具有过程实行了后,我们可依据操作是否中标来控制工作是否开展付出或者回滚。提交业务后会一次性把所有数据交到到数据库,如果回滚了事情就会放弃这次的操作,而针对原来表的多少未开展变更。

再就是免能够管有数据还能够而且插入。(有或有些插入成功,另外一些功亏一篑,后续还得抹。太难为)

SQLite中分头坐BEGIN、COMMIT和ROLLBACK启动、提交和回滚事务。见如下示例:

化解方式:

   @try{

添加事务处理,把5000长达插入作为一个工作

       char *errorMsg;

咱们下SQLite的作业进行控制:

        if (sqlite3_exec(_database, “BEGIN”, NULL, NULL,
&errorMsg)==SQLITE_OK) {

复制代码 代码如下:

              NSLog(@”启动工作成功”);

        db.beginTransaction();  //手动设置开始业务

              sqlite3_free(errorMsg);

        try{

              sqlite3_stmt *statement;

            //批量处理操作

              if (sqlite3_prepare_v2(_database, [@”insert into
persons(name) values(?);” UTF8String], -1, &statement,
NULL)==SQLITE_OK) {

            for(Collection c:colls){

             //绑定参数

                insert(db, c);

             const char *text=[@”张三”
cStringUsingEncoding:NSUTF8StringEncoding];

            }

             sqlite3_bind_text(statement, index, text, strlen(text),
SQLITE_STATIC);

            db.setTransactionSuccessful();
//设置事务处理成功,不设置会活动回滚不付。

             if (sqlite3_step(statement)!=SQLITE_DONE) {

//在setTransactionSuccessful和endTransaction之间不进行其他数据库操作

                 sqlite3_finalize(statement);

           }catch(Exception e){

             }

               MyLog.printStackTraceString(e);

      }

           }finally{

      if (sqlite3_exec(_database, “COMMIT”, NULL, NULL,
&errorMsg)==SQLITE_OK) {

               db.endTransaction(); //处理完成

           NSLog(@”提交业务成功”);

           }

       }

一、行使SQLiteDatabase的beginTransaction()方法可被一个业务,程序执行到endTransaction()
方法时见面检查工作的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful()
方法设置工作的标志吧打响,则拥有由beginTransaction()开始的操作都见面让交给,如果没调用setTransactionSuccessful()
方法虽然回滚事务。

        sqlite3_free(errorMsg);

二、应用例子如下:下面两长SQL语句以与一个作业中推行。

        }

Java代码

        else {

复制代码 代码如下:

            sqlite3_free(errorMsg);

//银行账户业务测试 
public void payment() 

    SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
    //开启事务 
    db.beginTransaction(); 
    try 
    { 
        db.execSQL(“update person set amount=amount-10 where
personid=?”, new Object[]{1}); 
        db.execSQL(“update person set amount=amount+10 where
personid=?”, new Object[]{2}); 
        //设置工作标志也打响,当了工作时即便见面付出事务 
        db.setTransactionSuccessful(); 
    } 
   catch(Exception e){
        throw(e);
    }
    finally 
    { 
        //结束事务 
        db.endTransaction(); 
    } 
}

        }

公或许感兴趣的篇章:

   }

    @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的起控制机制是使加锁之办法,实现简单,也充分巧妙.

相关文章

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图