程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> JDBC ORACLE事物處理

JDBC ORACLE事物處理

編輯:Oracle教程

JDBC ORACLE事物處理


數據庫事物:
在數據庫中,所謂事務是指一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。
為確保數據庫中數據的一致性,數據的操縱應當是離散的成組的邏輯單元:當它全部
完成時,數據的一致性可以保持,而當這個單元中的一部分操作失敗,整個事務應全部視
為錯誤,所有從起始點以後的操作應全部回退到開始狀態。
事務的操作:先定義開始一個事務,然後對數據作修改操作,這時如果提交(COMMIT),這些修改
就永久地保存下來,如果回退(ROLLBACK),數據庫管理系統將放棄所作的所有修
改而回到開始事務時的狀態。


事務的ACID(acid)屬性
1. 原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,
要麼都不發生。
2. 一致性(Consistency)事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
3. 隔離性(Isolation)事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務
內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個
事務之間不能互相干擾。
4. 持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,
接下來的其他操作和數據庫故障不應該對其有任何影響

事務:指構成單個邏輯工作單元的操作集合
事務處理:保證所有事務都作為一個工作單元來執行,即使出現了故障,都不能改變這種執行方式。
當在一個事務中執行多個操作時,要麼所有的事務都被提交(commit),要麼整個事務回滾(rollback)到最初狀態
當一個連接對象被創建時,默認情況下是自動提交事務:每次執行一個 SQL 語句時,如果執行成功,就會向數據
庫自動提交,而不能回滾
為了讓多個 SQL 語句作為一個事務執行:
調用 Connection 對象的 setAutoCommit(false); 以取消自動提交事務
在所有的 SQL 語句都成功執行後,調用 commit(); 方法提交事務
在出現異常時,調用 rollback(); 方法回滾事務

若此時 Connection 沒有被關閉, 則需要恢復其自動提交狀態

常用的代碼結構

 

    public void test(String sql, Object... args)
    {
        
        Connection conn = null;
        PreparedStatement prepareStatement = null;
        
        try
        {
            conn = getConn();
            // 事物處理前,取消Connection的默認提交行為
            conn.setAutoCommit(false);
            prepareStatement = conn.prepareStatement(sql);
            
            for (int i = 0; i < args.length; i++)
            {
                prepareStatement.setObject(i + 1, args[i]);
            }
            prepareStatement.executeUpdate();
            
            // 事物處理:如果事物處理成功則提交事物
            conn.commit();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            try
            {
                // 事物處理:如果出現異常 則在catch塊中回滾事物
                conn.rollback();
            }
            catch (SQLException e1)
            {
                e1.printStackTrace();
            }
        }
        finally
        { // 釋放數據庫資源
            releaseSource(prepareStatement, conn, null);
        }
        
    }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved