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