MySQL中的回滚点

参考链接:https://www.cnblogs.com/noteless/p/10312824.html

在JDBC中存在着保存点的概念:

public class JdbcExample {

    // 直接去lib/META-INF/services下面去拷贝即可
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    // 数据库的用户名与密码
    static final String USER = "root";
    static final String PASS = "root";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName(JDBC_DRIVER);
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            // 执行查询
            System.out.println("实例化Statement对象,即执行SQL语句的对象...");
            String sql1 = "delete from tb_user where id = 3";
            String sql2 = "delete from tb_user where id = 4";
            stmt = conn.createStatement();
            conn.setAutoCommit(false);

            int i = stmt.executeUpdate(sql1);
            Savepoint sql1Savepoint = conn.setSavepoint("sql1Savepoint");

            int i1 = stmt.executeUpdate(sql2);
            Savepoint sql2SavePoint = conn.setSavepoint("sql2SavePoint");
            // 回滚点,表示的回滚到哪个地方,然后提交回滚点的事务;在回滚点下面的代码将不会再来进行执行
            // 上面回滚到了sql1的位置上,那么上面的位置上是执行成功了;但是下面的没有来进行执行。
            conn.rollback(sql1Savepoint);
            // 目标方法执行成功,提交事务
            conn.commit();
        } catch (SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch (Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
            // 否则需要将事务来进行回滚操作
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

回滚点表示的是回滚到哪个回滚点,在这个点之前的SQL都将会执行成功;但是在这个点之后的SQL执行了相当于是没有执行成功。

posted @ 2022-01-20 10:31  写的代码很烂  阅读(299)  评论(0编辑  收藏  举报