【Java】连接Mysql实现回滚

前言

暑期项目实习第三课,用java写个连接Mysql实现回滚小程序。

建立简易的MySQl数据库

注意将id点上自动递增!
mysql
Tip:数据库建立内容详见第二课 【JAVA】连接Mysql的简单登陆注册实例.

任意添加点数据,用于后面实现功能。
添加数据

Code

连接数据库等方法详见第二课 【JAVA】连接Mysql的简单登陆注册实例.

import java.sql.*;
import java.util.Scanner;

public class jdbc_test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {    //输入psvm 或者 main后回车

        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;
        try {
            //获取连接
            conn = JDBCUtils.getCounection();
            //开启事务
            conn.setAutoCommit(false);
            //定义sql
            String sql1 = "update account set balance = balance - ? where id = ?"; //sql语句
            String sql2 = "update account set balance = balance + ? where id = ?";
            //获取执行sql对象
            pstmt1 = conn.prepareStatement(sql1);
            pstmt2 = conn.prepareStatement(sql2);
            pstmt1.setDouble(1,500);
            pstmt1.setInt(2,1);
            pstmt2.setDouble(1,500);
            pstmt2.setInt(2,2);

            //执行sql
            pstmt1.executeUpdate();
            //手动制造一个异常
//            int i = 3/0;
            pstmt2.executeUpdate();
            //提交事务
            conn.commit();

        }catch (Exception e){
            //事务回滚
            try{
                if(conn != null){
                    conn.rollback(); //事务回滚
                }
            }catch (SQLException e1){
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt1,conn);
            JDBCUtils.close(pstmt2,conn);
        }
    }
}

最终实现

未出现异常时效果

当注释掉抛出异常的语句时我们可以发现数据库数据发生了修改。

//            int i = 3/0;  //抛出异常的语句,3/0是不允许的。

运行前.
运行前
运行后.
运行后

出现异常时效果

未注释掉抛出异常的语句时我们可以发现数据库数据未发生修改。

            int i = 3/0;  //抛出异常的语句,3/0是不允许的。

运行前.
运行前
运行后.
运行后
并且java内部抛出异常.
Java抛出异常

总结

如果未对操作进行回滚操作时就可能发生在sql1语句完成后未执行sql2语句,导致严重的数据异常,后期维护系统将会付出巨大的代价!

在数据表中呈现的效果便会是小张已经失去¥500,而小王并未获得¥500

            //定义sql
            String sql1 = "update account set balance = balance - ? where id = ?"; //sql语句
            String sql2 = "update account set balance = balance + ? where id = ?";
            //获取执行sql对象
            pstmt1 = conn.prepareStatement(sql1);
            pstmt2 = conn.prepareStatement(sql2);
            pstmt1.setDouble(1,500);
            pstmt1.setInt(2,1);
            pstmt2.setDouble(1,500);
            pstmt2.setInt(2,2);
            pstmt1.executeUpdate();
            //手动制造一个异常
//            int i = 3/0;
            pstmt2.executeUpdate();
展开阅读全文
©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值