2023.12.7 关于 MySQL 事务详解
目录
事务的四大特性
原子性
一致性
持久性
隔离性
事务并发执行
脏读
不可重复读
幻读
四个隔离级别
read uncommitted
read committed
repeatable read
serializable
事务的四大特性
原子性
- 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节
- 事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从未发生过一样
一致性
- 指在数据库事务执行的过程中,系统从一个一致的状态转移到另一个一致的状态
- 一致性确保了数据库的完整性和业务规则的正确性
实例理解
- 银行转账事务
- 如果在事务执行前,两个账户的总和是 1000 元,那么在事务执行后,两个账户的总和应该仍然是 1000 元
- 这确保了在任何时刻,数据库都处于合法、符合业务规则的状态
持久性
- 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
注意:
- 事务在执行的时候,会把执行的过程先记录到硬盘上,再执行要进行的操作(该记录不会随着断电而丢失)
- 如果一个事务执行到一半 断电了!
- 等到下次重启的时候,此时 mysql 就会感知到,上个事务这里执行到了中间状态
- 就会根据之前记录的执行过程,进行回滚了!
隔离性
- 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
- 事务隔离分为不同级别,包括读未提交、读提交、可重复读、串行化
事务并发执行
- Mysql 是一个关系型数据库管理系统,其本体为数据库服务器,该服务器负责存储、管理、处理数据,并提供了一套 sql 语言接口供客户端与之交互
- 客户端通过连接到 Mysql 服务器,可以向服务器发送 sql 语句
- 事务是由一组 sql 语句组成的逻辑工作单元,它要么全部执行成功,要么全部失败回滚,事务通过执行 sql 语句来对数据库进行读取和更新操作
- 在多用户的数据库环境中,多个客户端可以同时连接到数据库服务器,并发送各自的事务请求,这就是并发执行,即多个事务可以同时在数据库中执行
- 多个事务同时操作数据库时可能会发生下述三种问题
脏读
- 脏读发生在一个事务读取了另一个事务还未正式提交的数据,因为存在回滚的可能性
实例理解
解决方法
- 给正在被修改的字段加上 写锁
不可重复读
- 不可重复读发生在一个事务内的两次读取之间,另一个事务修改了数据,导致两次查询结果不一致
实例理解
解决方法
- 给正在被查询的字段加上 读锁
幻读
- 幻读发生在一个事务内的两次查询之间,另一个事务插入或删除了数据,导致两次查询结果不一致
实例理解
解决方法
- 加上读锁 无法解决幻读问题,因为读锁仅作用于被查询的字段,无法被其他事务修改其字段值
- 使用串行化的方式才能解决该问题,即事务必须 串行 执行,不能 并行 执行
四个隔离级别
- Mysql 提供了四个隔离级别
read uncommitted
- 对事务的并发执行不做任何限制
- 其并发程度最高,隔离性最低
- 会产生脏读、不可重复读、幻读的问题
read committed
- 对写操作加锁
- 并发程度降低了,隔离性提高了
- 解决了脏读的问题,任然存在不可重复读、幻读的问题
repeatable read
- mysql 的默认隔离级别
- 对写和读都加锁了
- 并发程度又降低了,隔离性又提高了
- 解决了脏读、不可重复读的问题,任然存在幻读问题
serializable
- 严格串行化
- 并发程度最低(串行执行),隔离性最高
- 解决了脏读、不可重复读、幻读的问题
注意:
- 从上到下
- 隔离性依次增高
- 并发性依次降低
- 执行速度依次降低
- 数据可靠性依次提高
总结:
- 在实际的开发中就可以根据当前要解决的问题的需求场景,来决定使用哪个隔离级别
- 如果涉及到 金钱交易 这样的场景,就可以让让并发性低一点,隔离性高一点,以提高精准度
- 如果涉及到 统计点赞数、浏览量 这样的场景 ,就可以让并发性高一点,隔离性低一点,以提高效率