Skip to content

Latest commit

 

History

History
91 lines (52 loc) · 4.47 KB

1_数据库系统原理.md

File metadata and controls

91 lines (52 loc) · 4.47 KB

数据库系统原理

事务

概念

事务是逻辑上的一组操作,要么都执行,要么都不执行。

特性 ACID

1. 原子性(Atomicity)

事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。

回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

2. 一致性(Consistency)

数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

3. 隔离性(Isolation)

一个事务所做的修改在最终提交以前,对其它事务是不可见的。

4. 持久性(Durability)

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。

并发一致性问题

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。

丢失修改

T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。

脏读

T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

不可重复读

T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

幻影读

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

事务隔离级别

产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁(加锁)来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。

事务隔离级别如下:

隔离级别 说明
未提交读(READ UNCOMMITTED) 事务中的修改,即使没有提交,对其它事务也是可见的。
提交读(READ COMMITTED) 一个事务只能读取已经提交的事务所做的修改。
可重复读(REPEATABLE READ) 保证在同一个事务中多次读取同样数据的结果是一样的。
可串行化(SERIALIZABLE) 强制事务串行执行。

事务并发访问引起的问题及使用哪种事务隔离级别避免:

并发访问问题 事务隔离级别
丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免
脏读 READ-COMMITTED 事务隔离级别以上可避免
不可重复读 REPEATABLE-READ 事务隔离级别以上可避免
幻读 SERIALIZABLE 事务隔离级别以上可避免

即:

事务隔离级别 \ 并发问题 丢失修改 脏读 不可重复读 幻读
未提交读 (READ UNCOMMITTED) 避免 发生 发生 发生
提交读 (READ COMMITTED) 避免 避免 发生 发生
可重复读 (REPEATABLE READ) 避免 避免 避免 发生
可串行化 (SERIALIZABLE) 避免 避免 避免 避免