分佈式事務【2】【JDBC事務演示】

分佈式事務【1】【數據庫事務演示】: https://yuanyu.blog.csdn.net/article/details/104218792

/**
 * 張三給李四轉賬100元
 */
@Test
public void transfer() throws SQLException {
    Connection conn = null;
    Statement stmt = null;
    try {
        conn = JDBCConnectionUtil.getConnection();
        // 將自動提交設置爲false
        // 若設置爲true則數據庫將會把每一次數據更新認定爲一個事務並自動提交
        conn.setAutoCommit(false);
        stmt = conn.createStatement();
        // 將 “張三” 賬戶中的金額減少100
        stmt.execute("UPDATE account SET money = money - 100 WHERE name = '張三'");

        //TODO 發生了異常
        //int a = 1/0;
        
        // 將 “李四” 賬戶中的金額增加100
        stmt.execute("UPDATE account SET money = money + 100 WHERE name = '李四'");
        // 提交事務
        conn.commit();
        // 事務提交:轉賬的兩步操作同時成功
    } catch (Exception sqle) {
        try {
            // 發生異常,回滾在本事務中的操做
            // 事務回滾:轉賬的兩步操作完全撤銷
            conn.rollback();
        } catch (Exception ignore) {
        }
        sqle.printStackTrace();
    } finally {
        stmt.close();
        conn.close();
    }
}
//JDBCConnectionUtil
public static Connection getConnection() throws SQLException {
    String url = "jdbc:mysql://localhost:3306/tx?serverTimezone=UTC&characterEncoding=utf-8";
    String user = "root";
    String password = "123456";
    String className = "com.mysql.cj.jdbc.Driver";
    try {
        Class.forName(className);
    } catch (ClassNotFoundException e) {
        log.error(e.getMessage());
    }
    return DriverManager.getConnection(url, user, password);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章