目录
[读未提交(Read Uncommitted)](#读未提交(Read Uncommitted))
[读已提交(Read Committed)](#读已提交(Read Committed))
[可重复读(Repeatable Read)](#可重复读(Repeatable Read))
什么是事务?
事务 是 数据库操作的最小逻辑单元,
它把一组SQL组成一个整体,这些整体执行过程中要么全部成功执行,要么全部失败回滚。
事务的ACID特性
- 原子性(Atomicity):事务是不可分割的工作单元,要么全部完成,要么全部不完成。 不存在只执行到到一半的情况
- 一致性(Consistency):事务执行后,保证数据是正确且符合预期的。
- 隔离性(Isolation):多个事务相互不能影响。
- 持久性(Durability):事务一旦提交,存储在介质中,无论数据是否损毁,都不会影响安全性。
事务最终要满足 一致性的
通过原子性 隔离性 和 持久性 来实现的
基于事务的ACID 特性 ,这也就是 使用事务 的缘由
在数据库使用的过程中,对于修改的只要提交成功 就可以保存成功 ,只要回滚 就可以是事务恢复如初
事务语法
事务语法用于数据库操作中确保数据一致性,通常包含BEGIN、COMMIT、ROLLBACK等关键命令。
//事务的开始
START TRANSACTION;
或者
BEGIN;
//提交当前事务 并更改持久化保存
COMMIT;
//回滚当前的事务,取消对其的更改
ROLLBCAK;
在开起一段事务中,处于在事务中的SQL 都具有 ACID 的特性
此外 在commit 之后再 rollback 无效 因为数据已经落盘了 事务已经提交了
保存点
事务保存点 允许在事务执行过程中设置标记点,如果后续操作失败,可以回滚到保存点
Savepoint savepoint 1(保存名);
Savepoint savepoint 2(保存名);
多次建立保存点可以完成以下的操作

手动提交事务
事务的提交一般设置的是自动的
在使用 SHOW variables like 'autocommit';
可以检查事务是否是自动提交的

这里可以自主修改自动提交事务改为手动的
set autocommit = 0;
注意:
1.只要开始 START TRANSACTION 或者 BEGIN要必须经过commit 提交才能持久化 或者 rollback 回滚结束事务,与set autocommit 无关
2.但在手动提交事务情况之下,不用显示开启事务,在执行修改操作之后,提交或回滚操作事务时直接使用 commit 和 rollback
3.已经提交的事务不可以回滚
在每次重启之后 都会改为自动
若要永久为手动提交事务--->这里要在配置文件里修改
隔离级别
四种标准隔离级别
读未提交(Read Uncommitted)
最低的隔离级别,允许事务读取其他事务未提交的数据。
可能导致脏读、不可重复读和幻读。
读已提交(Read Committed)
事务只能读取其他事务已提交的数据。
避免了脏读,但可能出现不可重复读和幻读。
可重复读(Repeatable Read)
确保事务内多次读取同一数据的结果一致。
避免了脏读和不可重复读,但可能出现幻读。
串行化(Serializable)
最高的隔离级别,通过强制事务串行执行避免所有并发问题(脏读、不可重复读、幻读),
但性能最低。
- 脏读 :事务A读取了事务B未提交的数据,若事务B回滚,事务A读取的数据无效。
- 不可重复读 :事务A多次读取同一数据,期间事务B修改并提交了该数据,导致事务A两次读取数据结果不一致。
- 幻读 :事务A查询某范围数据时,事务B插入或删除了该范围内的数据并提交,导致事务A再次查询时结果集发生变化。
隔离级别与并发问题的关系
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | ✔ | ✔ | ✔ |
| Read Committed | ✖ | ✔ | ✔ |
| Repeatable Read | ✖ | ✖ | ✔ |
| Serializable | ✖ | ✖ | ✖ |
并发性能是由高到低的
但是安全性能却是恰恰相反的 有利就有弊 由低到高的
事务保证了数据的安全索引提升了数据查询的****效率