PostgreSQL中的ACID特性介绍

ACID是数据库事务的四个重要属性,包括原子性、一致性、隔离性和持久性。原子性确保事务要么全部成功,要么全部失败;一致性保证事务前后数据库状态有效;隔离性使并发事务互不影响;持久性则确保已提交事务即使在系统异常后仍能保持其效果。PostgreSQL通过不同的隔离级别来实现事务的并发控制,并采用预写日志和影子分页等技术保证持久性。
摘要由CSDN通过智能技术生成

更多精彩内容,请登录:ke.sandata.com.cn

任何关系型数据库中,ACID 是组成数据库的重要部分,是数据库事务的一组属性,该特性目的主要确保数据库在异常情况下保证数据的有效性。

数据库ACID特性

A(Atomicity)

原子性:

事务通常由多个语句组成。原子性保证将每个事务视为单个单元,该事务要么完全成功,要么完全失败。换句话说,如果在一个事务中,任何语句都未能完成,整个事务都会失败,未完成事务中的数据条目在数据库中保持不变。一个原子系统必须保证在任何情况下都具有原子性,包括电源故障,数据库错误和实例奔溃。同时,原子性可以防止在数据库中发生部分数据更新的情况。举一个例子,假设用户USER1 和 USER2 之间进行转账。这之间会进行两个动作,第一个动作,从USER1 账户中划钱;第二个动作,将从USER1账户中划拨的钱保存到 USER2 账户中。原子性在这个过程中可以保证数据库中的状态一致,即意味着从用户 USER1 账户减去(事务失败回滚不变)转账金额,在用户 USER2 账户中加上(事务失败回滚不变)转账金额。

上图中,假设用户USER1 有1000元,USER2用户有500 元,现在用户USER1向用户USER2 进行转账交易500元,如果在系统正常情况下,转账成功,那么 USER1账户的将会减去 500,用户USER2 账户的金额将会增加500。整个过程在事务完成后,数据库中的数据状态也将发生变化,用户USER1 将会被减去500 ,用户USER2将会被加上100,,并最终保持总账户金额一致。否则,用户之间的金额在数据库中保持原有数据状态。

C(Consistency)

一致性:

一致性确保事务只能使数据库从一个有效的状态进入到另一种有效的状态,并保证数据库数据最终的状态一致。一致性主要通过定义的一些规则来保证,比如在表对象上定义约束,触发器,级联或者之间组合而成的规则。通过这些规则来防止数据库中的非法事务(异常事务)。主外键主要维护数据库对象之间的参照完整性。例如在上面原子性的示例中,用户USER1 向用户USER2转账,那么就要在事务规则的约束下验证 USER1 + USER2 = 1500的一致有效性。假设在这个事务中,用户 USER1 向用户USER2 转账 500 元,那么用户 USER1 账户减去500,而 USER2 账户却没有变化,那么就要根据验证规则验证用户 USER1 + USER2 最终的状态是否为1500,现在看来,USER1账户转账 500 元,这个事务中用户 USER1 账户已经扣除了500 元,那么用户 USER1 现在的账户上剩余 500 元,对于事务来说,实现了原子性,但是账户验证结果为用户 USER1 + USER2 = 1000 元,这与事务规则验证用户 USER1 + USER2 = 1500 的状态不一致,那么必须要取消这个事务,并将受影响进行转账的事务回滚到事务前的一个状态。如果在一个事务中,存在其它约束、触发器等行为,则在提交事务之前,以相同的验证规则去检查每个更改操作。可能还有其它的约束规则,如要求表中的两列 COL1 和 COL 2必须为整数,那么如果此时输入 COL1 的值为一个浮点数,那么事务将会被取消,如果此列上有触发器,那么将会提示用户。还有在完整性约束的规则下,无论该表是参照表(主实体)或者引用表(子实体),是不允许删除其中一个表中的行,因为表主体之间收到主外键的约束影响。

I(Isolation)

隔离性:

隔离性主要保证多个事务可以同时进行,最简单的例子就是多个事务在对一张表同时进行读取和写入。隔离性可以保证多个事务之间同时进行,并互相不影响。同时,隔离性可以确保事务在并发执行时,数据库中的数据状态与执行事务所获取的的数据的状态是相同的。隔离性是事务并发控制的主要目标,根据不同的隔离特性,未完成的交易可能对于其他事务来说是不可见的。为了保证并发事务访问数据库对象,一般在关系型数据库中,会使用不同的方法来保证事务之间相互隔离。如Oracle使用SI(Snapshot Isolation)隔离特性,PostgreSQL使用SSL(Serializable Snapshot Isolation)隔离特性。

在数据库中,因为事务隔离的等级不同,所以根据事务需要的隔离级别,将隔离级别划分为四个等级,分别是读未提交(read

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值