持续创作,加速成长!这是我参与「掘金日新计划 · 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 数据库中的 事务。