我反悔了!)MySQL事务处理

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();
        }
    }
}
发布了12 篇原创文章 · 获赞 9 · 访问量 539

猜你喜欢

转载自blog.csdn.net/weixin_45219512/article/details/105420389