可以说事务是关系型数据库的核心。关系型数据库之所以能茁壮成长,和它对事务的支持密不可分。但是近些年来,大数据蓬勃发展,而且很多场景并不需要对事务的完全支持(例如,我在某个社交网站上关注了你,但是我的ID并不需要马上出现在你的粉丝列表里,完全可以延时一段时间后出现以减轻服务器的压力,这就和事务的原子性产生了冲突)。事实上关系型数据库的事务成了互联网应用的性能瓶颈。NoSQL正是摒弃了事务的某些特性,使得对于某些特殊应用,其性能是关系型数据库的很多倍。

  卖了这么多关子,下面具体来说说什么是事务。事务具有如下四个特性(ACID):

  1. A(Atomicity)原子性

    这个比较容易理解,原子性的意义在于一个事务里的所有操作要么全部做完,要么都不做。也就是说一个事务的成功执行就是所有操作全部成功,只要有一个操作失败,整个事务就是失败的。一个很好的例子是,比如银行转账,从A的账户转100元到B的账户。这个操作应该分为两步,(1)从A的账户减去100元,(2)把B的账户增加100元。若只完成第一步,未完成第二步,那么钱就会莫名其妙地少了100元,银行损失100元。若只完成第二步,而未完成第一步,那么钱就会莫名其妙增加100元,银行依然损失100元。

 

  2. C(Consistency)一致性

  在很多情况下,数据之间都是有关系的,也就是说,数据之间可能存在一些约束关系。而这些约束关系对这些数据的可用性来说是很重要的。所以一致性强调的是事务的运行不会改变数据库原本的一致性约束。比如现在有个约束条件:“a + b = 10”。如果一个事务中改变了a的值,那么这个事务页必须改变b的值,使得“a + b = 10”这个约束条件依然成立。否则事务失败。

 

  3.I(Isolation)独立性

  但凡是一个服务于大众的平台,一定会涉及到并发操作。所谓的独立性是指并发的事务之间不会相互影响。如果一个事务访问的数据正在被另外一个事务修改,只要另外一个事务没有提交,那么这个事务访问的数据就不会受到未提交事务的影响。例如,A准备给B转账100元,那么在这个事务没有完成的情况下,B查询自己的账户是不会看到新增的100元的。

 

  4.D(Durability)持久性

  持久性比较好理解。持久性是指事务一旦提交后就会永久地保存在数据库中,即使宕机了数据也不会丢失。比如你给支付宝的余额宝充值了100元,那么这100元只要你不花,就会永久地存储在数据库中,不会因为马云的服务器宕机了而丢失你这100元,对吧。

 

  以上就是我对事务的简单理解,一定会有所欠缺,欢迎博友指正。