真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

Android事務IMMEDIATE與EXCLUSIVE模式

事務是數(shù)據庫保證數(shù)據唯一性和一致性的技術,對于數(shù)據庫一個或一組寫操作要保證是一個原子操作就需要使用事務,android使用事務的常見形式如下:

創(chuàng)新互聯(lián)建站擁有十多年成都網站建設工作經驗,為各大企業(yè)提供網站制作、成都做網站服務,對于網頁設計、PC網站建設(電腦版網站建設)、重慶App定制開發(fā)、wap網站建設(手機版網站建設)、程序開發(fā)、網站優(yōu)化(SEO優(yōu)化)、微網站、域名注冊等,憑借多年來在互聯(lián)網的打拼,我們在互聯(lián)網網站建設行業(yè)積累了很多網站制作、網站設計、網絡營銷經驗,集策劃、開發(fā)、設計、營銷、管理等網站化運作于一體,具備承接各種規(guī)模類型的網站建設項目的能力。

SQLiteDatabase db = null;
... 

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


那么db.beginTransaction是一個什么操作? 我們來看下SQLiteDatabase的源碼:

/**
     * Begins a transaction in EXCLUSIVE 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 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是執(zhí)行:execSQL("BEGIN EXCLUSIVE;");  false執(zhí)行execSQL("BEGIN IMMEDIATE;");


BEGIN EXCLUSIVE:當前事務在沒有結束之前任何android中的其他線程或進程都無法對數(shù)據庫進行讀寫操作。
BEGIN IMMEDIATE:確保android中其他線程或者進程之間讀取數(shù)據不能修改數(shù)據庫。

為什么需要判斷mConnectionPool==null這個條件,如果當mConnectionPool!=null 表示調用了enableWriteAheadLogging,也就是使用了WAL MODE。 使用WAL模式是能夠提高并發(fā)性,讀與寫互不阻塞,而執(zhí)行BEGIN EXCLUSIVE卻降低了并發(fā),互相矛盾,所以當以上兩個條件都成立的情況下執(zhí)行BEGIN EXCLUSIVE。


分享名稱:Android事務IMMEDIATE與EXCLUSIVE模式
網站鏈接:http://weahome.cn/article/jsdjpc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部