91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android事務 IMMEDIATE與EXCLUSIVE模式

發布時間:2020-06-15 10:07:55 來源:網絡 閱讀:865 作者:小偉老師 欄目:移動開發

事務是數據庫保證數據唯一性和一致性的技術,對于數據庫一個或一組寫操作要保證是一個原子操作就需要使用事務,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。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀宁县| 子长县| 元江| 余庆县| 沙雅县| 准格尔旗| 枝江市| 邹城市| 延安市| 洛宁县| 庐江县| 台南县| 秭归县| 申扎县| 海门市| 榆林市| 故城县| 枣阳市| 炎陵县| 建水县| 贵阳市| 奉节县| 阿拉尔市| 稷山县| 绥中县| 华安县| 龙口市| 东安县| 海门市| 鄂托克前旗| 海淀区| 库尔勒市| 乌恰县| 大渡口区| 连平县| 都昌县| 安丘市| 霍林郭勒市| 抚宁县| 田林县| 天祝|