我爱编程数据库

事务ACID属性与隔离级别

2018-08-22  本文已影响5人  zhipingChen

概念

数据库领域中的事务指的是一系列对数据库的操作集合,是数据库管理系统(DBMS)定义的一个执行单位。事务的作用体现在两个方面:

当然以上两条是事务理论上应该持有的特性,但是实际应用过程中,由于业务需求的不同或配置方式不同,事务对以上两个方面的满足程度也不尽相同。

ACID 属性

事务是 DBMS 定义的一个逻辑概念,其作为一个执行单元,内部包含了一系列数据库操作。但是并非所有的数据库操作序列都可以被归纳为事务,可以通过四个属性来描述事务:

note:
原子性和一致性约束的内容不同,事务中的操作,全部执行或全部不执行是原子性约束,一致性要求的是数据库完整性约束条件不被破坏,例如在 A 表上建立对 B 表的外键关联约束,则向 A 表插入记录时,若关联的 B 表不存在对应记录,就是违反了一致性约束。

事务所能体现出的作用就是通过其所具有的属性定义的,隔离性保证了数据库的并发访问中,多个事务之间彼此隔离,避免相互影响;原子性则保证了即使事务执行失败,仍然能够将数据库恢复到执行前状态;一致性则是在数据库操作执行异常时,维护健康的关系约束条件不被破坏掉。持久性则是保证数据的修改被记录到持久化设备上,不受系统异常或设备断电的影响。

隔离级别

在实际应用中,对数据库的并发访问是必然的,如何在多个事务的同时操作下保证每个业务流都能获取正确的结果,依靠的就是 DBMS 提供的不同程度的隔离级别。ANSI/ISO SQL 定义的标准隔离级别如下:

脏读指的是,事务读取到的数据可能是不正确、不合理或者处于非法状态的数据,例如在事务 T_1 读取后,事务 T_2 可能又对数据做了修改,或者事务 T_2 中某些操作违反了一致性约束,作了回滚操作,该情况下事务 T_1 读取到的数据称之为脏数据,该行为称之为脏读。

不可重复读指的是,对于同一个事务的前后两次读取操作,读取到的内容不同。例如在事务 T_1 读取操作后,事务 T_2 可能对数据做了修改,事务 T_2 修改完成提交后,事务 T_1 又做了读取操作,因为内容已被修改,导致读取到的内容与上一次不同,即存在不可重复读现象。

幻读指的是,事务中前后相同的查询语句,返回的结果集不同。例如在事务 T_1 查询表记录后,事务 T_2 向表中增加了一条记录,当事务 T_1 再次执行相同的查询时,返回的结果集可能不同,即存在幻读现象。

锁的使用是为了在并发环境中保持每个业务流处理结果的正确性,这样的概念在计算机领域中很普遍,但是都必须要基于一个前提,或者称之为约定:在执行操作前,首先尝试去获取锁,获取成功则可以执行,若获取失败,则不执行或等待重复获取。因为无论任何类型的操作,有没有锁都不影响程序本身的执行流程,但只有遵从这个约定才能体现出其价值。就像红绿灯并不影响车辆本身的行驶能力,只有声明所有个体皆遵守相同的规则,所以一切才变得有序。当然在数据库的并发环境下,隔离程度越高,也就意味着并发程度越低,所以各个数据库中一般设置的都是一个折中的隔离级别。

上一篇下一篇

猜你喜欢

热点阅读