基础知识点
事务四大特性(ACID)
原子性( Atomicity)
- 一个事务中包含的所有操作作为一个整体在数据库中执行,要么全部成功,对数据库中的数据产生改变;要么全部失败,对数据库中的数据不产生影响。
一致性(Consistency)
- 数据库的事务不能破坏关系数据的完整以及业务逻辑上的一致性
- 例如账户A向账户B进行转账,不能出现A账户已经扣款,但是B账户未加款的情况
隔离性(Isolation)
- 在并发环境下,不同事务同时访问数据库时,每个事务之间没有任何干扰
- 下方将详细介绍隔离级别
持久性(Durability)
- 事务一旦被提交,数据库中的数据发生永久性改变,并且不会因为数据库系统故障造成丢失已经提交的事务情况
隔离级别
读未提交
描述
- 即使事务没有提交,其他事务也可以读到
- 写数据时只会锁住相应的行
导致问题
脏读
- 事务A 读取了事务B更新的操作,但是B进行了回滚,并未真正提交到数据库中,此时事务A读到的是脏数据
小结
- 性能上来说读未提交并不会比其他隔离级别有较大的性能提升,并且会造成较大的问题,在实际中很少使用这个隔离级别
读已提交
描述
- 每个事务只能读取其他事务已经提交的内容,无法读取未提交内容,为提交的内容对于其他事务是不可见的
- 大多数数据库的默认隔离级别,但不是MySQL的默认隔离级别
- 解决了脏读问题
导致问题
- 导致了不可重复读的问题,并发状态下同一个事务中两次同样的查询可能得到不同的结果
可重复读(默认级别)
描述
- 保证同一个事务中多次读取同样的记录结果是一直的
- MySQL的默认隔离级别
- 写数据的时候会锁住整张表
- 解决了不可重复读的问题
导致问题
- 产生了幻读的问题,即事务B两次读取的过程中,A新增了数据,导致事务B读取到了前一次没有读取到的行
总结
幻读和不可重复读的区别:
- 幻读更加强调的是行的增加
- 而不可重复读强调的是数据的更新
串行化
描述
- 最高的隔离级别,事务只能一个接一个的顺序执行,不允许并发执行,解决了上述所有问题
- 读写数据的时候都会锁住整张表
导致问题
- 效率会被严重降低,导致大量超时
总结
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
不可重复读 | × | × | √ |
串行化 | × | × | × |
1 条评论
!!!哇,解决了我思索好久的数据库单记录高并发读写问题