JDBC事务自动提交机制转手动提交,事务回滚,存储点设置

目录

  • 一、什么是自动提交:
  • 二、手动提交事务,提交事务,事务回滚:
  • 三、设置存储点:

一、什么是自动提交:

  1. 只要任意一条DML(增删改)语句执行,则自动提交一次。
  2. 但是在实际的业务中,通常都是N条DML语句共同联合才能完成的,这N条语句构成一个事务。必须保证这些DML语句在同一个事务中同时执行或同时不执行。(比如银行转账需要两条UPDATE语句,必须同时执行或同时不执行,不然会有安全问题)

二、手动提交事务,提交事务,事务回滚:

  1. 重点三行代码:
    connection.setAutoCommit(false);//设置事务提交方式为手动提交
    connection.commit();//所有语句在内存中都执行后提交事务,更新数据库信息,设置了setAutoCommit必须使用此方法。
    connection.rollback();//如果事务中有语句执行失败,事务回滚,回滚已完成的操作,事务中所有语句的执行结果不写入数据库。
  2. 例子:
    (1)初始数据库信息:
    在这里插入图片描述
    (2)使用自动提交机制zhang向li转账5000,使用toString方法模拟中途出现异常,事务中有语句无法执行。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Test {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedstatement = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            String url = "jdbc:mysql:/";
            String username = "";
            String password = "";
            connection = DriverManager.getConnection(url,username,password);
            //3.获取数据库操作对象
            preparedstatement = connection.prepareStatement("update account set balance = ? where id = ?");
            //传值
            preparedstatement.setInt(1,5000);
            preparedstatement.setString(2,"zhang");
            //4.执行sql
            preparedstatement.executeUpdate();

            String s = null;//模拟中途出现异常,后面语句无法执行
            s.toString();
            //传值
            preparedstatement.setInt(1,5000);
            preparedstatement.setString(2,"li");
            //4.执行sql
            preparedstatement.executeUpdate();

        } catch (Exception throwables) {
            throwables.printStackTrace();
        }finally {
            //6.释放资源
            if (preparedstatement != null) {
                try {
                    preparedstatement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

JDBC事务自动提交机制转手动提交,事务回滚,存储点设置_第1张图片
(3)使用手动提交机制zhang向li转账5000,使用toString方法模拟中途出现异常,事务中有语句无法执行。

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

public class Test {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedstatement = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            String url = "jdbc:mysql:/";
            String username = "";
            String password = "";
            connection = DriverManager.getConnection(url,username,password);
            connection.setAutoCommit(false);//手动提交
            //3.获取数据库操作对象
            preparedstatement = connection.prepareStatement("update account set balance = ? where id = ?");
            //传值
            preparedstatement.setInt(1,5000);
            preparedstatement.setString(2,"zhang");
            //4.执行sql
            preparedstatement.executeUpdate();

            String s = null;//模拟中途出现异常,后面语句无法执行
            s.toString();
            //传值
            preparedstatement.setInt(1,5000);
            preparedstatement.setString(2,"li");
            //4.执行sql
            preparedstatement.executeUpdate();
            connection.commit();//手动提交
        } catch (Exception throwables) {
            //捕获到异常回滚事务
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            throwables.printStackTrace();
        }finally {
            //6.释放资源
            if (preparedstatement != null) {
                try {
                    preparedstatement.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

JDBC事务自动提交机制转手动提交,事务回滚,存储点设置_第2张图片

三、设置存储点:

如果操作出现异常,则回滚到存储点,存储点之前代码正常执行,存储点之后代码撤销。
JDBC事务自动提交机制转手动提交,事务回滚,存储点设置_第3张图片

你可能感兴趣的:(JDBC,数据库,sql,java)