Android事务 IMMEDIATE与EXCLUSIVE模式

事务是数据库保证数据唯一性和一致性的技术,对于数据库一个或一组写操作要保证是一个原子操作就需要使用事务,android使用事务的常见形式如下:

SQLiteDatabase db = null;
... 

db.beginTransaction();
try {
   db.setTransactionSuccessful();
   ...
} finally {
   db.endTransaction();
}

那么db.beginTransaction是一个什么操作? 我们来看下SQLiteDatabase的源码:

/**
     * Begins a transaction in EXCLUSIVE mode.
     * <p>
     * Transactions can be nested.
     * When the outer transaction is ended all of
     * the work done in that transaction and all of the nested transactions will be committed or
     * rolled back. The changes will be rolled back if any transaction is ended without being
     * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.
     */
    public void beginTransaction() {
        beginTransaction(null /* transactionStatusCallback */, true);
    }

/**
     * Begins a transaction in IMMEDIATE mode. 
     *Transactions can be nested. When
     * the outer transaction is ended all of the work done in that transaction
     * and all of the nested transactions will be committed or rolled back. The
     * changes will be rolled back if any transaction is ended without being
     * marked as clean (by calling setTransactionSuccessful). Otherwise they
     * will be committed.
     */
    public void beginTransactionNonExclusive() {
        beginTransaction(null /* transactionStatusCallback */, false);
    }

从注释中可以看到beginTransaction的调用使用EXCLUSIVE mode, beginTransactionNonExclusive使用IMMEDIATE mode,以上两个方法都是调用SQLiteDatabase的私有方法beginTransaction,两个方法不同之处在于第二个实参true|false, 这个私有方法源码:

private void beginTransaction(SQLiteTransactionListener transactionListener,
            boolean exclusive) {
        verifyDbIsOpen();
        lockForced(BEGIN_SQL);
        boolean ok = false;
        try {
           ...
            // This thread didn‘t already have the lock, so begin a database
            // transaction now.
            if (exclusive && mConnectionPool == null) {
                execSQL("BEGIN EXCLUSIVE;");
            } else {
                execSQL("BEGIN IMMEDIATE;");
            }
           ...
        } finally {
            if (!ok) {
                // beginTransaction is called before the try block so we must release the lock in
                // the case of failure.
                unlockForced();
            }
        }
    }

当形参exclusive为true并且mConnectionPool==null是执行:execSQL("BEGIN EXCLUSIVE;");  false执行execSQL("BEGIN IMMEDIATE;");

BEGIN EXCLUSIVE:当前事务在没有结束之前任何android中的其他线程或进程都无法对数据库进行读写操作。
BEGIN IMMEDIATE:确保android中其他线程或者进程之间读取数据不能修改数据库。

为什么需要判断mConnectionPool==null这个条件,如果当mConnectionPool!=null 表示调用了enableWriteAheadLogging,也就是使用了WAL MODE。 使用WAL模式是能够提高并发性,读与写互不阻塞,而执行BEGIN EXCLUSIVE却降低了并发,互相矛盾,所以当以上两个条件都成立的情况下执行BEGIN EXCLUSIVE。

时间: 2024-10-09 03:43:46

Android事务 IMMEDIATE与EXCLUSIVE模式的相关文章

ZXing for Android 修改为竖屏模式

zxing github连接:https://github.com/zxing/zxing 以下为修改方法 Step 1: Add following lines to rotate data before buildLuminanceSource(..) in decode(byte[] data, int width, int height) DecodeHandler.java: byte[] rotatedData =newbyte[data.length];for(int y =0;

android:process结合activity启动模式的一次实践

会有这样的场景,一个应用崩溃了,而导致的该应用崩溃的原因是,该应用占用的内存大小超过了系统分配给它的最大堆大小.对象的分配,是发生在堆(heap)上面的,系统分配给每个应用的最大堆大小是固定的. 假设,出现这种情况了,你的应用再启动一个activity,就导致了你的应用崩溃了,你的应用使用的内存超过了系统分配的最大堆大小.那么,这个时候,可以采取做法是,优化算法之类的,但是,假设,你优化了,但是,依然出现这个问题. 那么,可以采取这种做法:让被启动的Activity运行在一个新的独立进程中,这样

IOS 与ANDROID框架及应用开发模式对比一

IOS 和ANDROID操作系统都是目前流行的移动操作系统,被移动终端和智能设备大量采用,两者都采用了先进的软件技术进行设计,为了方便应用开发两者都采用了先进的设计模式.两者在框架设计上都采用了什么技术?都采用了什么设计模式?两者设计思路和应用开发模式有什么异同呢? 两者都采用了框架模式. IOS 的框架称为Cocoa Touch. 框架提供两个作用,一是类的集合,每个类构建一个问题空间,并提供完整的解决方案和服务:二更重要的是框架中的类相互依赖构成一个整体,制订并实现整个应用程序的结构.框架定

Android 当打开“开发人员模式”中的“不保留活动”后,程序应当怎么保持正常执行

Android 当打开"开发人员模式"中的"不保留活动"后,程序应当怎么保持正常执行咧. .? 在这几天,我一直在纠结这个问题.从发现,程序出现这个问题,是由于"开发人员模式"中的"不保留活动"被打开了,到怎么获取"不保留活动"的值. 发现"不保留活动",是从京东客服端获得的灵感 得到"不保留活动"的值.是查看了Android原声的APP,Settings应用程序,查

Android KK后为何工厂模式下无法adb 无法重启机器 ?

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 KK 以后 为何工厂模式下无法adb reboot ? 正常情况下adb reboot 可以重启. [Keyword] adb reboot, factory mode, 工厂模式, 工厂模式无法重启 [版本约束] android 4.4,  KK 或者KK 以后版本

Android学习——ActivityManager与Proxy模式的运用

Android学习--ActivityManager与Proxy模式的运用 - Dufresne - 博客园 一 Proxy模式 意图: ?????? 为其他对象提供一种代理以控制这个对象的访问. 适用性: l? 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表. l? 虚代理(Virtual Proxy)根据需要创建开销很大的对象.使用一个代理对象作为代表,在真正的需要时进行创建. l? 保护代理(Protection Proxy):控制对原始对象的访问.保护

Android中的创建型模式总结

共5种,单例模式.工厂方法模式.抽象工厂模式.建造者模式.原型模式 单例模式 定义:确保某一个类的实例只有一个,而且向其他类提供这个实例. 单例模式的使用场景:某个类的创建需要消耗大量资源,new一个对象代价太大,如访问IO和数据库等资源,或者避免多次创建该对象消耗内存过多. 懒汉模式 public class Singleton{ private static Singleton instance; private Singleton(){} public static synchronize

Android学习CursorWrapper与Decorator模式 (转至http://www.cnblogs.com/bastard/archive/2012/05/31/2527944.html)

一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一些额外的职责,额外的职责很可能是来自我们自己的扩展或者某些时刻的特定需求等. 于是通过一种方式对现有的对

Android学习CursorWrapper与Decorator模式

Android学习CursorWrapper与Decorator模式 - Dufresne - 博客园 一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一