数据库系统原理
事务
概念
事务是逻辑上的一组操作,要么都执行,要么都不执行。
特性 ACID
1. 原子性(Atomicity)
事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
2. 一致性(Consistency)
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
3. 隔离性(Isolation)
一个事务所做的修改在最终提交以前,对其它事务是不可见的。
4. 持久性(Durability)
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。
并发一致性问题
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。
丢失修改
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
<div align="center"><img src="https://github.com/DuHouAn/ImagePro/raw/master/java-notes/database/88ff46b3-028a-4dbb-a572-1f062b8b96d3.png" width="350px"></div>
脏读
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
<div align="center"><img src="https://github.com/DuHouAn/ImagePro/raw/master/java-notes/database/dd782132-d830-4c55-9884-cfac0a541b8e.png" width="350px"></div>
不可重复读
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
<div align="center"><img src="https://github.com/DuHouAn/ImagePro/raw/master/java-notes/database/c8d18ca9-0b09-441a-9a0c-fb063630d708.png" width="350px"></div>
幻影读
T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
<div align="center"><img src="https://github.com/DuHouAn/ImagePro/raw/master/java-notes/database/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png" width="350px"></div>
事务隔离级别
产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁(加锁)来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其它事务也是可见的。
提交读(READ COMMITTED)
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
可重复读(REPEATABLE READ)
保证在同一个事务中多次读取同一数据的结果是一样的。
可串行化(SERIALIZABLE)
强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。
隔离级别能解决的并发一致性问题:
并发访问问题 | 事务隔离级别 |
---|---|
丢失修改 | MySQL 所有事务隔离级别在数据库层面上均可避免 |
脏读 | READ-COMMITTED 事务隔离级别以上可避免 |
不可重复读 | REPEATABLE-READ 事务隔离级别以上可避免 |
幻读 | SERIALIZABLE 事务隔离级别以上可避免 |
即:
事务隔离级别 \ 并发问题 | 丢失修改 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读 (READ UNCOMMITTED) | 避免 | 发生 | 发生 | 发生 |
提交读 (READ COMMITTED) | 避免 | 避免 | 发生 | 发生 |
可重复读 (REPEATABLE READ) | 避免 | 避免 | 避免 | 发生 |
可串行化 (SERIALIZABLE) | 避免 | 避免 | 避免 | 避免 |
https://www.mianshi.online,https://www.i9code.cn
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。