欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java】连接Mysql实现回滚

程序员文章站 2024-01-26 15:30:28
...

前言

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

建立简易的MySQl数据库

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

任意添加点数据,用于后面实现功能。
【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是不允许的。

运行前.
【Java】连接Mysql实现回滚
运行后.
【Java】连接Mysql实现回滚

出现异常时效果

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

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

运行前.
【Java】连接Mysql实现回滚
运行后.
【Java】连接Mysql实现回滚
并且java内部抛出异常.
【Java】连接Mysql实现回滚

总结

如果未对操作进行回滚操作时就可能发生在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();