数据库原理

事务
概念:事务指的是满足 ACID 特性到一组操作,可以通过 commit 提交事务,也可以使用 rollback 进行回滚。

图片

1. 原子性(Atomicity)
事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

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

3. 隔离性(Isolation)
一个事务所做的修改在最终提交以前,对其它事务是不可见的。

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

使用重做日志来保证持久性。

AUTOCOMMIT

Mysql 采用自动提交的方式,如果没有特殊设置事务级别,每个查询都会当做一个事务来提交。

并发一致性问题

  1. 丢失修改

    T1 和 T2 两个事务都对数据进行了修改,T1 先修改,T2 再修复,这样 T2 就可能覆盖 T1 的数据
    图片

  2. 脏读

    T1 通过事务对数据进行了更改,T2 读取了数据,这时候 T1 撤销了更改,这样 T2 读取的数据就是脏数据
    图片

  3. 不可重复读

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

  4. 幻影读

    T1 读取某个范围的数据,T2 往这个范围中插入数据,T1 再次读取的时候和第一次读取的结果不一样。
    图片
    产生并发不一致的主要原因是破坏了事务的隔离性,解决办法是通过对并发进行控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁实现需要用户自己控制,相当的负责。所以数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。