1. 程式人生 > 實用技巧 >JDBC事務機制

JDBC事務機制

案例10:JDBC事務機制:

package com.java.JDBC;


import java.sql.*;


/*
JDBC事務機制:
    1 JDBC中的事務是自動提交的,什麼是自動提交?
        只要執行任意一條DML語句,則自動提交一次。這是JDBC預設的事務行為。
        但是在實際的業務當中,通常都是N條DML語句共同聯合才能完成的,必須
        保證他們這些DML語句在同一個事務中同時成功或者同時失敗。
        
    2 以下程式先來驗證一下JDBC的事務是都是自動提交機制。
        測試結果:JDBC中只要執行任意一條DML語句,就提交一次。
*/ public class JDBCTest10 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1 註冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 2 獲取連線 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","333");
// 3 獲取預編譯資料庫操作物件 String sql = "update dept set dname = ? where deptno = ?"; ps = conn.prepareStatement(sql); // 第一次給佔位符傳值 ps.setString(1,"x部門"); ps.setInt(2,30); int count = ps.executeUpdate(); System.out.println(count);
// 重新給佔位符傳值 ps.setString(1,"y部門"); ps.setInt(2,20); count = ps.executeUpdate(); System.out.println(count); } catch (Exception e) { e.printStackTrace(); } finally { // 6 釋放資源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }

案例11:通過JDBC模擬銀行轉賬系統

package com.java.JDBC;


import java.sql.*;


/**
* sql指令碼:
*     drop table if exists t_act;
*     create table t_act(
*         actno bigint,
*         balance double(7,2) // 注意:7表示有效數字的個數,2表示小數位的個數。
*     );
*
*     insert into t_act(actno,balance) values(111,20000);
*     insert into t_act(actno,balance) values(222,0);
*     commit;
*
*     select * from t_act;
*
*     重點三行程式碼?
*      conn.setAutoCommit(false);
*      conn.commit();
*      conn.rollback();
*/
public class JDBCTest11 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
    
        try {
            // 1 註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            
            // 2 獲取連線
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","333");
            
            // 將自動提交機制修改為手動提交
            conn.setAutoCommit(false);// 開啟事務
            
            // 3 獲取預編譯資料庫操作物件
            String sql = "update t_act set balance = ? where actno = ?";
            ps = conn.prepareStatement(sql);
            
            
            // 給?傳值
            ps.setDouble(1,10000);
            ps.setInt(2,111);
            int count = ps.executeUpdate();
            
            /*String s = null;
            s.toString();*/
            
            // 再給?傳值
            ps.setDouble(1,10000);
            ps.setInt(2,222);
            count += ps.executeUpdate();
            
            
            System.out.println(count == 2 ? "轉賬成功" : "轉賬失敗");
        
            // 程式能夠走到這裡說明以上程式沒有異常,事務結束,手動提交資料
            conn.commit();// 提交事務
            
        } catch (Exception e) {
            // 回滾事務
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            // 6 釋放資源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}