文章目录
1.数据库的四大特性ACID
1.0ACID原则
ACID分别是
atomicity
,consistency
,isolation
和durability
的缩写,表示原子性、一致性、隔离性和持久性。它是数据库系统需要的四个基本原则。ACID和数据库中事务的概念息息相关,MySQL的事务特性遵守ACID原则。
1.1原子性(atomicity/,ætə’mɪsɪti/)
一个事务对数据库做的多个更改,要么在事务被提交时所有更改都成功,要么在事务被回滚时所有更改都撤销。
1.2一致性(consistency /kən’sɪstənsi/)
在每次提交(commit)或回滚(rollback)之后,和事务运行过程中,数据库始终保持一致状态.
例如:跨多个表更新相关数据时,查询到的所有相关表的数据要么都是新值(这是一个状态),要么都是是旧值(这是一个状态),不会看到新值和旧值混合情况。也就是数据库始终保持一致状态。
- 一致读 事务读取数据只能从一个状态中读取,不能从2个或者2个以上状态读取。也就是T(n)只能从C(n-1),C(n-2)… C(1)中的一个状态读取数据,不能一部分数据读取自C(n-1),而另一部分数据读取自C(n-2)。
- 一致写 事务执行的数据变更只能基于上一个一致的状态,且只能体现在一个状态中。T(n)的变更结果只能基于C(n-1),C(n-2), …C(1)状态,且只能体现在C(n)状态中。也就是说,一个状态只能有一个事务变更数据,不允许有2个或者2个以上事务在一个状态中变更数据。至于具体一致写基于哪个状态,需要判断T(n)事务是否和T(n-1),T(n-2),…T(1)有依赖关系。
1.3隔离性(isolation /ˌaɪsəˈleɪʃn/)
多个事务在运行过程中互相保护或者隔离。它们不会干扰或者看到对方未提交的数据(这个由隔离别决定)。事务之间的隔离性是通过锁机制实现的。有经验的用户可以调整隔离级别,在可以确保事务之间不会相互干扰的情况下,减少事务之间的保护来提高数据库性能和并发性。
1.4持久性(Durability)
持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
2.事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ-UNCOMMITTED) | √ | √ | √ |
读提交(READ-COMMITTED) | × | √ | √ |
重复读(REPEATABLE-READ) | × | × | √ |
串行化(SERIALIZABLE) | × | × | × |
2.并发操作可能会发生的问题
2.1脏读
脏读是指一个事务读取了未提交事务执行过程中的数据。
2.2不可重复读
不可重复读是指对于数据库中的某个数据,一个事务执行过程中多次查询返回不同查询结果,这就是在事务执行过程中,数据被其他事务提交修改了。
不可重复读同脏读的区别:
- 脏读是一个事务读取了另一未完成的事务执行过程中的数据
- 不可重复读是一个事务执行过程中,另一事务提交并修改了当前事务正在读取的数据
2.3幻读
幻读是事务非独立执行时发生的一种现象,例如事务T1批量对一个表中某一列列值为1的数据修改为2的变更,但是在这时,事务T2对这张表插入了一条列值为1的数据,并完成提交。此时,如果事务T1查看刚刚完成操作的数据,发现还有一条列值为1的数据没有进行修改,而这条数据其实是T2刚刚提交插入的,这就是幻读。
幻读和不可重复读的区别
- 不可重复读是select同一个数据发现的到的结果跟刚才不一样。
- 不可重复读针对的是同一条数据,幻读针对的是一片数据。
- 不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
- 幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样