1107 字
6 分钟
数据库ACID四大特性

什么是ACID四大特性#

A : Atomicity(原子性) C : Consistency(一致性) I : Isolation(隔离性) D : Durability(持久性)

Atomicity(原子性)#

这里要先讲一下什么是事务:  简单说,事务就是一组原子性的SQL执行单元。如果数据库引擎能够成功地对数据库应 用该组査询的全部语句,那么就执行该组SQL。如果其中有任何一条语句因为崩溃或其 他原因无法执行,那么所有的语句都不会执行。要么全部执行成功(commit),要么全部执行失败(rollback)。

原子性指的是一个事务中所有操作要么全部成功要么全部失败。

Consistency(一致性)#

数据库的一致性指的是: 每个事务必须使数据库从一个合法的状态,转变到另一个合法的状态,并且在事务执行前后,数据库的各种完整性约束都得以保持。

什么是完整性约束呢? 完整性约束是指数据库中数据的规则和限制,比如主键约束、外键约束、唯一性约束等。 主键约束: 确保每条记录都有唯一标识。 外键约束: 确保数据之间的引用关系正确。 唯一性约束: 确保某列的值在表中是唯一的

举个例子: 当我们向订单表插入一条记录的时候,如果指定的customer_id在客户表中不存在,那么这个事务就不应该被提交,因为这会破坏数据的一致性。因此,外键约束会阻止事务提交,确保数据库的一致性。抛出外键约束异常

Isolation(隔离性)#

数据库的隔离性指的是: 每个事务的执行都应该是独立的,互不干扰。即使多个事务同时执行,也不会影响彼此的结果。 隔离性确保了事务之间的独立性,防止了脏读、不可重复读和幻读等问题。

如果没有隔离性,在多个用户并发访问数据库的情况下,可能会出现以下问题:

  • 脏读(Dirty Read): 一个事务读取到另一个事务尚未提交的修改,如果该事务回滚,那么读取到的就是无效数据。
  • 不可重复读(Non-repeatable Read): 一个事务在同一事务内多次读取同一数据,却得到不同的结果,这是因为其他事务修改并提交了数据。
  • 幻读(Phantom Read): 一个事务在同一事务内多次执行相同的查询,但是每次查询返回的结果集不同,这是因为其他事务插入或删除了数据。

事务隔离级别:

  • 读未提交 >> 事务可以读取其他事务未提交的数据,可能会导致脏读。
  • 读已提交 >> 事务只能读取已提交的数据,防止脏读。
  • 可重复读 >> 事务在执行期间多次读取同一数据,结果保持一致,防止不可重复读。
  • 串行化 >> 事务完全隔离,按顺序执行,防止幻读。

数据库的默认隔离级别是可重复读(Repeatable Read),它可以防止脏读和不可重复读,但可能会出现幻读。(也就是无法避免读取数据的时候,其他事务提交新的数据或者删除数据,导致查询的结果集发生变化。

之前老把幻读和不可重复读搞混,现在再讲一下,所谓幻读,就是说读取数据过程中,另外一个数据库事务插入或者删除了数据,导致查询的数据结果集发生变化。而不可重复读是指在同一个事务中多次读取同一个数据,期间其他事务修改了数据,导致数据结果集不一致。

每个隔离级别都提供了不同程度的隔离性和性能,具体选择取决于应用场景和需求。

Durability(持久性)#

数据库的持久性指的是: 一旦事务提交,对数据库的修改就会永久保存,即使系统崩溃也不会丢失。 持久性确保了数据的可靠性和稳定性,即使在系统故障或崩溃后,已提交的事务数据仍然可以恢复。