数据库(2) ——事务
文章目录
- 数据库(2) ——事务
- 1.事务特性(ACID)
- 2.事务隔离级别
- 3.MySQL的ACID特性分别是怎么实现的?
- 3.1原子性实现原理
- 3.2一致性实现原理
- 3.3隔离性实现原理
- 3.4持久性实现原理
- 待更新--
①原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
②一致性(Consistency)
事务发生前后在整体上必须保持逻辑一致性。
③隔离性(Isolation)
事务是独立单位,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
④持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
①读未提交
一个事物允许读另一个未提交事务的数据。
②读提交
一个事物必须在另一个事物提交后读取。
③重复读
一个事物开始重复读某个数据时,其他事物不可访问与修改该数据。
④序列化
要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。
参考答案
3.1原子性实现原理当事务执行失败或调用了rollback,导致事务需要回滚,我们可以撤销该事物执行的所有操作,回退到初始状态。
3.2一致性实现原理①保证原子性、持久性和隔离性,如果这些特性无法保证,事务的一致性也无法保证。
②数据库本身提供的保障,例如不允许向整形列插入字符串值、字符串长度不能超过列的限制等。
③应用层面进行保障,例如如果转账操作只扣除转账者的余额,而没有增加接收者的余额,无论数据库实现的多么完美,也无法保证状态的一致。
隔离性追求的是并发情形下事务之间互不干扰。简单起见,我们主要考虑最简单的锁机制。
隔离性的探讨,主要可以分为两个方面。
①第一方面,(一个事务)写操作对(另一个事务)写操作的影响:
锁机制保证隔离性。
要求同一时刻只能有一个事务对数据进行写操作,事务在修改数据之前,需要先获得相应的锁。
锁可以分为表锁、行锁以及其他位于二者之间的锁。
表锁在操作数据时会锁定整张表,并发性能较差。
行锁则只锁定需要操作的数据,并发性能好。
出于性能考虑,绝大多数情况下使用的都是行锁。
②第二方面,(一个事务)写操作对(另一个事务)读操作的影响:
MVCC保证隔离性。
它最大的优点是读不加锁,因此读写不冲突,并发性能好。
3.4持久性实现原理我们首先提供了缓存(Buffer Pool)。
当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool。
当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。
但是如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。
于是,我们引入了日志的概念。
用来记录对数据库执行的历史操作。



