MySQL事务处理
事务处理是来维护数据的完整性的。可以使批量的数据要么都执行,要么不执行(有错误的话)。
比如说我们去银行汇款,要是汇款的操作成功了,对方取钱的操作失败了,那不是被白嫖?所以我们设置操作可以撤回。这就叫事务处理
首先了解一个概念:引擎
并非所有的引擎都支持事务处理 查看你的引擎
show table status from 库名;
InnoDB 一个可靠的事务处理引擎,不支持全文搜索 MyISAM 性能极高,支持全文搜索,不支持事务处理 MEMORY
功能等同于MyISAM,数据存在内存中,速度很快
建表时确定引擎
create table students(...)engine=InnoDB;
如果你建表的时候后面没有engine=引擎名 那就是默认引擎 我的是InnoDB,可能你的跟我不一样
————————————
然后我们来了解一下三个关键字
rollback | (回退)用于撤销操作 |
---|---|
commit | (提交)用于将结果写入数据表 |
savepoint | (保留点)回退到这个保留点,不用对整个事务回退 |
默认情况执行sql语句的时候都是自动提交的,就是说一执行就写入表中了 不能回退
–
一、我们可以通过设置自动提交使我们可以撤回
//查看自动提交开关
select @@autocommit;
//设置手动提交
set autocommit=0;
//如果是默认自动提交,每执行一条sql都会自动提交无法rollback
–
二、还有一种可以使我们撤回的方法就是开启事务,无需修改autocommit
start transaction
//或者begin 作用与 start transaction相同
//执行一些sql语句(修改数据之类的)
rollback;
//你不能回退create、drop、select操作
提交(写入)数据
start transaction
//执行一些sql语句(修改数据之类的)
commit;
//提交之后不能回退
使用保留点
savepoint delete1;
rollback to delete1;
当我们提交或者回退之后,事务会自动关闭,以后的更改就会隐含提交
如果你用JBDC处理事务
就要修改成手动提交
public class Transaction{
public static void main(String[] args) {
//初始化
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e){
e.printStackTrace();
}
String sql="insert into hero values(0,?,?,?)";
try( //连接数据库
Connection cn= DriverManager.getConnection(
"jdbc:mysql://localhost:3306/fzk?serverTimezone=UTC",
"root", "810481");
PreparedStatement p=cn.prepareStatement(sql);
){ cn.setAutoCommit(false); //将自动提交修改成手动
p.setString(1,"奥巴马");
p.setInt(2,96);
p.setInt(3,49);
//这个数字是指从 '?' 开始,setString插入的是第一个问号
p.execute();
cn.rollback(); //回滚,这条数据将不会插入
}catch (SQLException e){
e.getErrorCode();
}
}
}