1. 程式人生 > 其它 >JDBC事務開啟、事務提交、事務回滾 -- 轉賬演示

JDBC事務開啟、事務提交、事務回滾 -- 轉賬演示

JDBC事務開啟、事務提交、事務回滾--轉賬演示

1、轉賬前:

2、程式碼:

package com.happy.lesson1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;

//轉賬演示
public class JDBCTest11 {
    public static void main(String[] args) {
        ResourceBundle bundle = ResourceBundle.getBundle("JDBC");
        String driver = bundle.getString("driver");
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");
        Connection conn = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            //1.註冊驅動
            Class.forName(driver);

            //2.獲取連線
            conn = DriverManager.getConnection(url,user,password);

            //關閉自動提交(開啟事務)
            conn.setAutoCommit(false);

            //3.獲取資料庫操作物件
            String sql = "update t_act set balance = ? where actno = ?";//處理sql語句
            ps = conn.prepareStatement(sql);

            //傳值
            //111轉賬10000元給222
            ps.setDouble(1,10000);
            ps.setInt(2,111);
            //4.1執行sql
            count = ps.executeUpdate();

            //發生異常
            int e = 1/0;

            //222收到轉賬10000元
            ps.setDouble(1,10000);
            ps.setInt(2,222);
            //4.2執行sql
            count += ps.executeUpdate();

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

        } catch (Exception e) {
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            //5.處理結果集
            System.out.println((count==2)?"轉賬成功":"轉賬失敗");

            //6.關閉資源
            try {
                if (ps != null){
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}

3、執行程式碼,轉賬發生異常時

111的金額還是20000元,222金額還是0元,金額沒有因為異常而丟失,說明事務事件起了作用。

4、修復異常,再執行程式碼

idea軟體沒有報錯,資料庫資料也顯示正常,說明程式碼正常,轉賬成功!

5、改動了哪些地方

5.1 用try

因為發現發生異常後,後面的程式碼都無法執行了,例如發生異常後,後面的事務回滾也執行不到了

5.2 事務的3條重要程式碼

//關閉自動提交(開啟事務)
conn.setAutoCommit(false);

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

//事務回滾
conn.rollback();

5.3 把處理結果集放到了finally

因為我想在控制檯看是否轉賬成功,無論是否發生異常。

5.4 提升作用域

Connection conn = null;
PreparedStatement ps = null;
int count = 0;

就是放在try的外面,讓finally也能訪問到

5.5 簡單的異常

//發生異常
int e = 1/0;

5.6 結果累加

count += ps.executeUpdate();

明確隻影響2條資料庫資料,以便更好的處理結果集