事务的特点 - 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();
}
}
}
}