在学习事务的过程中,我们总会遇到ACID这四个原则,什么是ACID?以下就来简单介绍下。
以下内容摘抄自《高性能MySQL 第3版》。
ACID分别指:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
我们还是以一个经典的银行例子来看,假如银行数据库里有两张表,储蓄卡表(savings)和信用卡表(credits),用户进行信用卡还款100元操作,那么就需要至少有以下三个操作:
1.检查储蓄账户的余额高于100元;
2.从储蓄账户的余额中减去100元;
3.在信用卡账户余额中增加100元;
上述三个步骤的操作必须在一个事务中,任何一个步骤失败,则必须回滚所有的步骤,所以我们如果按照事务的代码,可以有以下的步骤。
START TRANSACTION; SELECT balance FROM savings WHERE customer_id = 123; UPDATE savings SET blance = blance - 100 WHERE customer_id = 123; UPDATE credits SET balance = balance + 100 WHERE customer_id = 123; COMMIT;
可以看出来,如果都执行成功倒还好,如果执行到第四条语句时,服务器突然崩溃了,这个时候用户很可能会损失100元。
因此,一个运行良好的事务处理系统,必须全部具备ACID这些标准特征。以下是各个特征的解释:
原子性(atomicity):
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
一致性(consistency):
数据库总是从一个一致性的状态转换到另外一个一致性的状态。在上面的例子中,一致性已经确保了,即使在执行第三第四条语句之间时发生崩溃,有了一致性也不会损失100元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。
隔离性(isolation):
通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。
还是以上面的例子,当执行完第三条语句,第四条语句还未开始时,此时用户查询余额,会看到余额并没有减去100元,这就是隔离性。
持久性(durability):
一旦事务提交,那么所做的修改都会永久的保存到数据库中。
此时即使系统崩溃,修改的数据也不会丢失。持久性是有个模糊的概念,因为实际上持久性也分很多不同的级别。
有些持久性策略能够提供非常强的安全保障,而有些未必。
以上就是ACID的简介,至于ACID实际在数据库中的应用及实现方法,后续文章会介绍。