数据库的ACID和隔离级别

本文详细介绍了数据库的ACID四大特性——原子性、一致性、隔离性和持久性,以及事务的隔离级别,包括脏读、不可重复读和幻读等并发操作可能遇到的问题。ACID原则是数据库系统的基础,而隔离级别的设置则影响了事务间的相互影响和数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据库的四大特性ACID

1.0ACID原则

ACID分别是atomicityconsistencyisolationdurability的缩写,表示原子性、一致性、隔离性和持久性。它是数据库系统需要的四个基本原则。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次读出来的记录数不一样
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值