Express-学习之路 20,mysql-事务

137 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

Express-学习之路 20,mysql-事务

引言

本系列会以我的一个理解,来介绍并开始学习 Express

中间会插入自己所联系到的 乱七八糟 的 知识点

事务

主要作用就是,操作几个步骤的时候,需要 要么全部执行成功,要么全部执行失败。

在某个步骤错误的时候,就需要回滚事务。

事务的提交方式 默认是 自动,下面这行语句,可以看到提交方式

select @@autocommit;

得到的值 只有两个

  • 1 是自动提交

  • 0 是手动提交

设置事务的 提交方式 为手动提交

set @@autocommit = 0;
  • 开启事务 的 sql 语句为

    start transaction 或 begin
    
  • 提交事务:commit

    意思是我们的事务方式为 手动提交时。

    在处理完 sql 语句后,需要主动提交指令 commit;

  • 回滚事务:rollback

一旦提交事务 或者 回滚事务,那么就会对数据库中的数据进行永久改变,

事务级别

主要有四种隔离级别,mysql 数据库的默认隔离级别为第三种 可重复读 repeatable read

从上往下 隔离级别 越来越高。

隔离级别脏读不可重复读幻读
read uncommitted✔️✔️✔️
read committed✔️✔️
repeatable read✔️
serializable

read uncommitted

隔离级别最低

这种情况主要是 我们在处理事务,但是还没有 commit 提交的时候

别人就可以读到我们 事务 更改的数据。

read committed

隔离级别 升了一级

这种情况主要解决了 read uncommitted 事务未提交,就能查看的问题。也就是解决了 脏读的问题。

只能我们 commit 提交之后。别人才可以读到我们 事务 更改的数据。

但是会导致 不可重复读的问题

  • 我们开启一个事务

  • 在这一个事务当中,同一个sql语句,查询到的结果是不一样的。

repeatable read

隔离级别 升了一级

解决了第二种,不可重复读问题。

在一个事务当中,同一个 sql 语句,得到的结果是一样的。

会有 幻读 问题

  • 我们在当前这个事务中,查询一个数据时,并未查到。之后我们会添加数据

  • 但是我们还没有 添加之前,别人添加了数据

  • 就会导致我们添加数据失败

  • 我们可能会在这个事务中,继续查询。虽然数据存在,我们就是查询不到。

  • 这就是幻读

serializable

隔离级别 最高

可以解决幻读问题

但是这个 隔离级别太高了,导致 mysql 性能不好

查看设置 事务级别

  • 查看事务隔离级别
select @@transaction_isolation;
  • 设置事务隔离级别

    • session 当前客户端

    • global 所有客户端

    set [session | global] transaction isolation level {四种级别中的任意一个}
    

总结

学习了 mysql 数据库中的 事务。