最经典的事务场景有:银行转账,12306 购票等。
严格来说,并非任意的对数据库的操作序列都是数据库事务,必须拥有 ACID 特性。
ACID:
原子性(Atomicity): 事务作为一个整体被执行,其中的所有操作要么全部都执行成功,要么都不执行。任何一项操作失败,则整个事务失败,且其它已被执行的操作都被撤销并回滚。 一致性(Consistency): 事务应确保数据库的状态从一个一致性状态转变为另一个一致性状态。一致性状态:指数据库中的数据应满足完整性约束。 隔离性(Isolation): 多个事务并发执行时,一个事务的执行不影响其他事务的执行。事务的 4 种隔离级别: READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE4 种级别的隔离性依次增强,但并发性能依次降低,实际开发中通常使用第 2 种 READ_COMMITTED。 持久性(Durability): 已被成功提交的事务对数据库的修改应该永久保存在数据库中。在单机数据库中很容易实现 ACID 特性,从而保证数据的严格一致性,但在分布式系统中却很难实现。
分布式事务:
在分布式系统中,发起事务的客户端、事务的操作对象、资源服务器等分别位于不同节点上,通常涉及对多个数据源或业务系统的操作。 需要解决的难题: 如何在数据一致性、系统可用性、分区容错性三者之间取得平衡?(即 CAP 理论)目前,所有的分布式系统都不可能同时满足 CAP,最多只能同时满足其中的两项。 CAP 理论: 一致性:Consistency 多个节点上的副本数据始终保持一致可用性:Avaliability 系统服务一直处于可用状态,在用户能够容忍的时间内对每一个请求都能返回结果。分区容错性:Partition tolerance 在遇到任何网络分区故障(部分子网络故障)时,仍能对外提供正常服务总体来说,传统的事务使用 ACID 的强一致性模型,BASE 理论面向大型高可用可扩展的分布式系统,通过牺牲强一致性来获得更高的可用性,允许数据在一段时间内是不一致的,但最终要达到一致状态。
实际的分布式系统架构中,不同业务对数据的一致性要求是不同的,通常会将 ACID 特性和 BASE 理论结合使用。