事务
理解事务
事务(Transactions)是指构成单一逻辑工作单元的操作集合。在计算机术语中,事务通常就是指数据库事务,是数据库恢复和并发控制的基本单元。它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。比如:从一个银行账户转账到另一个账户,完整的交易需要从一个账户减去转账的金额,然后将相同的金额添加到另一个账户,这两个操作要么成功执行,要么执行失败回滚到最初状态。它保证在任何情况下都不会出现在转账后从一个帐户中扣除了资金,而未将其存入另一个帐户的情况。
事务的目的
在实际应用场景下,一个数据库事务的执行过程中,有可能会遇到事务操作失败、数据库系统出错、甚至是硬件设备出现故障等问题。为了简化我们的编程模型,数据库事务针对数据库宕机、网络异常、并发修改等问题都提供了完整方案。出现故障、整个数据库要么提交、要么回滚。所以本质上,事务的出现了是为了应用层服务的,而不是数据库系统本身的需要 。
事务应用场景
**所有对数据一致性有要求业务,都是事务应用场景。**比如常见电商场景,购买一个商品需要在商品、商家、仓储、支付、用户等各个流通环节保持数据一致性。
事务处理
早期,电商服务是一个单体服务,一个服务对应单一数据源数据库。随着业务量逐渐增大,很快数据库成为系统瓶颈。这时候通过分库分表让商家、仓储、支付等数据存储在不同数据源上,然后单个服务通过使用多个数据源处理业务。随着团队规模越来越大,在一个单体服务上更新业务、部署服务成本也越来越高。这时候,一个新的技术概念微服务也随之诞生。
使用微服务架构,将应用程序构建为独立组件,并将每个应用程序进程做为一项服务运行。比如支付系统做为电商业务中一个微服务,用来处理订单、银行账户扣费等信息。对外提供轻量级API,对内操作数据库读写数据。可见在微服务场景下,程序处理和数据读写分布在各个应用进程中。
为了保证数据一致性,必须要对应用程序添加事务的处理。可以看到上面描述的不同形态服务事务处理对应关系:
-
本地事务
- 单服务单数据源
-
分布式事务
-
单服务多数据源
-
多服务多数据源(微服务)
-
可见开发一个依赖事务的应用程序,需要熟悉并了解本地事务以及分布式事务原理及应用。那么我们如何学习好事务?
事务学习大纲
事务学习遵循一个循序渐进过程。在学习过程中,我们需要多问一些问题。
问题1: 事务基本原理是什么?
事务包含了四大特性,也就是ACID。A: 一致性、C:可用性、I:隔离性、D:持久性。所有的事务都必须满足这些特性
问题2: 并发事务存在什么问题?
并发事务存在脏读、幻读、不可重复读问题。为了解决并发事务存在的问题,数据库设计了四种隔离级别,分别是:未提交读、提交读、可重复读、可串行化
问题3: mysql实现事务的基本手段
主要通过redo log、undo log、 mvcc等特性
问题4: 单体应用如何依靠mysql实现一个本地事务?
了解java应用程序实现事务方式,通过具体编码实现去理解
问题5: 分布式事务原理
分布式事务实际是一个个本地事务的操作集合。通过理解分布式事务的一些协议:mysql XA 、TCC、SAGA,学习基本原理。然后通过学习jta、spring+atomikos实现方式学习分布式事务。
最后,学习一些开源分布式事务解决方案以及一个具体的分布式数据库论证分布式事务原理。
内容小结
事务分为本地事务和分布式事务。通过学习事务一些原理,可用让我们更好的运用到我们实际业务系统中。