JDBC--處理事務與隔離級別

1、事務

在數據庫中,所謂事務是指一組邏輯操做單元,使數據從一種狀態變換到另外一種狀態。java

(1)事務的ACID(acid)屬性

1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工做單位,事務中的操做要麼都發生,要麼都不發生。 sql

2. 一致性(Consistency)
事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態。數據庫

3. 隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其餘事務干擾,即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。併發

4. 持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來的其餘操做和數據庫故障不該該對其有任何影響。函數

(2)JDBC 事物處理

事務處理:保證全部事務都做爲一個工做單元來執行,即便出現了故障,都不能改變這種執行方式。當在一個事務中執行多個操做時,要麼全部的事務都被提交(commit),要麼整個事務回滾(rollback)到最初狀態.學習

當一個鏈接對象被建立時,默認狀況下是自動提交事務:每次執行一個 SQL 語句時,若是執行成功,就會向數據庫自動提交,而不能回滾。spa

爲了讓多個 SQL 語句做爲一個事務執行:.net

  • 調用 Connection 對象的 setAutoCommit(false); 以取消自動提交事務
  • 在全部的 SQL 語句都成功執行後,調用 commit(); 方法提交事務
  • 在出現異常時,調用 rollback(); 方法回滾事務
  • 若此時 Connection 沒有被關閉, 則須要恢復其自動提交狀態

 關於事務:code

  1. 若是有多個操做,每一個操做使用的是本身單獨的鏈接,則沒法保證事務。
  2. 具體步驟:
  • 事務開始操做前,開始事務,取消connection的默認提交行爲:connection.setAutoCommit(false);
  • 若是事務的操做都成功,則提交事務:connection.commit();
  • 回滾事務,若出現異常,則在catch塊中回滾事務:connection.rollback();

 模板

@Test
    public void test16() {
        Connection conn = null;

        try {
            conn = getConnection2();

            //開始事務: 取消默認提交
            conn.setAutoCommit(false);

            //...

            //提交事務
            conn.commit();

        } catch(Exception e) {
            //..

            //回滾事務
            try {
                conn.rollback();
            } catch(Exception e1) {
                e1.printStackTrace();
            }
        } finally {
            //...
        }
    }

2、數據庫的隔離級別

對於同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 若是沒有采起必要的隔離機制, 就會致使各類併發問題:對象

  • 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但尚未被提交的字段. 以後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
  • 不可重複讀: 對於兩個事物 T1, T2, T1 讀取了一個字段, 而後 T2 更新了該字段. 以後, T1再次讀取同一個字段, 值就不一樣了.
  • 幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個字段, 而後 T2 在該表中插入了一些新的行. 以後, 若是 T1 再次讀取同一個表, 就會多出幾行.

數據庫事務的隔離性: 數據庫系統必須具備隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各類併發問題.。

一個事務與其餘事務隔離的程度稱爲隔離級別. 數據庫規定了多種事務隔離級別, 不一樣隔離級別對應不一樣的干擾程度, 隔離級別越高, 數據一致性就越好, 但併發性越弱。

 Mysql 支持 4 中事務隔離級別。Mysql 默認的事務隔離級別爲: REPEATABLE READ

在程序中經過如下語句設置隔離級別:

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

 

 

JDBC學習筆記:

1. 獲取數據庫鏈接    http://my.oschina.net/daowuming/blog/704243

2. 經過Statement執行更新、查詢操做    http://my.oschina.net/daowuming/blog/704384

3. 使用PrepareStatement    http://my.oschina.net/daowuming/blog/704432

4. 使用ResultSetMetaData 對象處理結果集元數據    http://my.oschina.net/daowuming/blog/704487

5. 使用DatabaseMetaData獲取數據庫信息    http://my.oschina.net/daowuming/blog/704553

6. BLOB    http://my.oschina.net/daowuming/blog/704593

7. 處理事務與隔離級別    ----當前----

8. 批量處理    http://my.oschina.net/daowuming/blog/704641

9. 數據庫鏈接池    http://my.oschina.net/daowuming/blog/704700

10. 調用函數與存儲過程    http://my.oschina.net/daowuming/blog/704813

相關文章
相關標籤/搜索