事务的特性:ACID
1. A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解为组成物质的基本单位,也是我们进行数据处理操作的基本单位。即所有操作要么同时成功,要么同时失败,不可再分割。
2. C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,最终结果是一致的 。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏。
3. I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影响。也就是说一个事务在提交之前,对其他事务都是不可见的。
4. D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。
在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。
事务并发操作时可能带来以下的一些问题:
-
脏读:一个事务在读取操作时,将其他事务未提交的数据读取到了
-
丢失更新:撤消一个事务时,把其它事务提交的更新的数据覆盖了
-
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
-
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读
隔离级别 | 脏读 | 不可重复读 | 幻读 | 第一类丢失更新 | 第二类丢失更新 |
读未提交(read-uncommitted) | 允许 | 允许 | 允许 | 不允许 | 允许 |
读已提交(read commited) | 不允许 | 允许 | 允许 | 不允许 | 允许 |
可重复读(repeatable read) | 不允许 | 不允许 | 允许 | 不允许 | 不允许 |
可串行化(serializable) | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 |
第 1 类丢失更新:事务 A 撤销时,把已经提交的事务 B 的更新数据覆盖了。
第 2 类丢失更新:事务 A 覆盖事务 B 已经提交的数据,造成事务 B 所做的操作丢失。