Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 數據庫的事務,android數據庫事務

Android 數據庫的事務,android數據庫事務

編輯:關於android開發

Android 數據庫的事務,android數據庫事務


什麼是數據庫的事務

事務(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。事務由事務開始和事務結束之間執行的全體操作組成。

特性

事務是恢復和並發控制的基本單位。

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。

原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。

持久性(durability)。指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

    db.beginTransaction();
    try {
        ...
        db.setTransactionSuccessful();
    } catch (Exception e) {
        Toast.makeText(this, "產生異常,事務回滾", 0).show();
    } finally {
        db.endTransaction();
    }

1、修改數據庫

將之前創建的person.db數據庫添加一列account來記錄帳務

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG, "數據庫的版本發生變化了");
        db.execSQL("alter table person add  account varchar(20)");
    }

並修改PersonSQLiteOpenHelper方法中的版本號,將其加1

    public PersonSQLiteOpenHelper(Context context) {
        // context 上下文
        // person.db 數據庫文件名稱
        // factory 游標工廠
        // version 數據庫的版本號 從1開始
        super(context, "person.db", null, 5);
        // TODO Auto-generated constructor stub
    }

接著單元測試運行TestPersonDB.java中的testCreateDB方法

2、數據庫事務操作

案例:
張三給王五匯款
1. 張三 account - 1000
2. 王五 account + 1000

    public void testTransaction() throws Exception {
        PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
        SQLiteDatabase db = helper.getReadableDatabase();
        // 開始數據庫的事務
        db.beginTransaction();
        try {
            db.execSQL("update person set account=account-1000 where name=?",
                    new Object[] { "zhangsan" });
            
            int i = 2/0; //制造異常測試事務操作

            db.execSQL("update person set account=account+1000 where name=?",
                    new Object[] { "wangwu" });

            // 標記數據庫事務執行成功
            db.setTransactionSuccessful();

        } catch (Exception e) {

        } finally {
            db.endTransaction();
            db.close();

        }

    }

最後使用sqlite3查看數據庫person表中的數據,轉賬沒有成功,張三和王五的錢都沒有變化

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved