SQLite事务处理

发布时间:2018-11-17  栏目:sqlite  评论:0 Comments

应用程序初始化时需要批量底向阳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(); 
    } 
}

        }

而可能感兴趣的篇章:

  • Android开发中之数据库事务用法分析
  • Android
    SQLite事务处理结合Listview列表显示力量示例
  • Android
    用SQLite实现业务的方
  • Android
    SQLite数据库增删改查操作的应用详解
  • Android使用SQLite数据库的简单实例
  • android创建数据库(SQLite)保存图片示例
  • Android中之SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)
  • android实现raw文件夹导入数据库代码
  • Android中操作SQLite数据库快速入门教程
  • Android实现用曾经发送的短信写副短信数据库的点子
  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的章程详解
  • Android数据库中工作操作方法之银行转化示例

   }

    @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地图