SQLite的事务操作

本文介绍如何在SQLite数据库中通过事务处理优化批量数据操作效率,避免因单条语句操作导致的磁盘读写频繁问题,提供一个案例演示如何在遇到程序异常时保护已执行操作不受影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sqlite中常常需要对大量数据批量操作。若使用for循环方法,效率较低。因为 sqlite操作数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。10000条记录就要进行10000次读写磁盘操作,而且不能保证所有数据都能成功操作。(有可能部分成功,另外一部分失败,后续还得删除。太麻烦)

解决方法:
添加事务处理,把10000条数据操作作为一个事务。这样可大幅度提高操作速度,往往效率高出10倍左右。

主要用到以下三个方法:
(1)开始事务
db.beginTransaction();
(2)循环完毕后,设置实务操作成功为true
db.setTransactionSuccessful();
(3)在finally语句中结束事务
db.endTransaction();

如果程序执行到endTransaction之前调用了 setTransactionSuccessful方法设置事务的标志为成功,则提交事务;如果没有调用setTransactionSuccessful方法则回滚事务。

使用事务,可以避免程序因为出错而终止运行,例如下面转款的例子。如果ATM机在转款过程中挂掉,通过事务处理可以防止之前运行结果的改变。

public void testTransaction() {
        PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());
        SQLiteDatabase db = openHelper.getWritableDatabase();
        if (db.isOpen()) {
            try {
                //开启事务
                db.beginTransaction();
                //1.从张三账户中扣1000块钱
                db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");
                //ATM机挂掉了
                int result = 10/0;
                //向李四账户中加1000块钱
                db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");
                //标记事务成功
                db.setTransactionSuccessful();
            } finally {
                //停止事务
                db.endTransaction();
            }
        }

    }

下面是对10000条数据批处理的例子。

public void testTransactionInsert() {
        PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());
        SQLiteDatabase db = openHelper.getWritableDatabase();
        if (db.isOpen()) {

            //1.记住当前的时间
            long start = System.currentTimeMillis();
            //2.开始添加数据
            try {
                db.beginTransaction();
                for (int i = 0; i<10000; i++) {
                    db.execSQL("insert into person(name,age,balance) values ('wang"+i+"',"+(10+i)+","+(10000+i)+")");
                }
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
            //3.记住结束时间,计算耗时
            long end = System.currentTimeMillis();
            long diff = end - start;

            db.close();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值