菜鸟笔记
提升您的技术认知

事务提交和回滚机制

事务的特点  -  ACID 特性

A - atomicity  原子性 : 不可分割, 只有成功和失败两种结果。

C - Consistency  一致性:  事务前后数据状态要保持完全一致, 总数一致

I - Isolation -  隔离性 : 多个事务不能看到对方的中间状态(提交或者回滚之前的状态)

D - Duration 持久性: 事务完成后数据要持久化(事务的影响要反映在物理存储上)
 

事务的两种状态:

事务的提交:是指事务里的所有操作都正常完成。

事务的回滚:是指程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。

实例:

import java.sql.*;

public class Transaction {
    private final static String URL = "jdbc:mysql://localhost:3306/test1";
    private final static String USER = "root";
    private final static String PASSWORD = "root";
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
//            关闭自动提交事务
            connection.setAutoCommit(false);
//            第一步:停止自动提交事务之后,开始向表中录入数据
//            录入订单主表
            String sql = "insert into orders(order_no,customer,order_date) values (?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,"20201201");
            preparedStatement.setString(2,"李**");
            preparedStatement.setString(3, "2020-1-1");
            preparedStatement.executeUpdate();
//             第二步:查询订单主键
            sql = "select MAX(order_id) from orders ";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            int id = 0;
            if (resultSet.next()){
                id = resultSet.getInt(1);
                System.out.println(id);
            }
//            第三部分:根据查到的orders表中的id编号进行数据添加
            sql = "insert into " +
                    "order_detail(order_id,goods_name,goods_num,googs_price)" +
                    "values(?,?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
//            绑定参数
            preparedStatement.setInt(1,id);
            preparedStatement.setString(2,"电脑");
            preparedStatement.setInt(3,10);
            preparedStatement.setDouble(4,100);
            preparedStatement.executeUpdate();
            connection.commit();
            System.out.println("事务提交");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();

        } catch (SQLException e) {
            e.printStackTrace();
            try {
                connection.rollback();
                System.out.println("事务回滚");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally {
            try {
                if (resultSet!=null){
                    resultSet.close();
                }
                if (preparedStatement!=null){
                    preparedStatement.close();
                }
                if (connection!=null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}