事务
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
事务的四个特效ACID
- Atomic 原子性,原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败;
- Consistency 一致性,事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态;
- Isolation 隔离性,隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间;
- Druation 持久性,事物的持续性也称持久性,是指一个事务一旦提交,它对数据库的改变将是永久性的,因为数据刷进了物理磁盘了,其他操作将不会对它产生任何影响。
事务的并发问题
- 脏读,在事务A修改数据之后提交数据之前,这时另一个事务B来读取数据,如果不加控制,事务B读取到A修改过数据,之后A又对数据做了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。;
- 不可重复读,一个事务内在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了变更、或者某些记录已经被删除了;
- 幻读,事务A在按查询条件读取某个范围的记录时,事务B又在该范围内插入了新的满足条件的记录,当事务A再次按条件查询记录时,会产生新的满足条件的记录(幻行 Phantom Row)
事务的隔离级别
- 读未提交(read uncommitted),一个事务还没有提交时,它做的变更就能被别的事务看到;
- 读提交(read committed),一个事物提交之后,它做的变更才会被其他事务看到;
- 可重复读(repeatable read),一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。
- 串行化(serializable),强制事务串行执行,对于同一行记录,“写” 会加 “写锁”,“读” 会加 “读锁”,当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。这样多个事务互不干扰,不会出现并发一致性问题;在此级别下,事务串行执行。可以避免脏读、不可重复读、幻读等读现象。但是效率低下,耗费数据库性能,不推荐使用。
针对不同的隔离级别,并发事务时可能发生的问题也会不同:
分布式事务
分布式事务是一种全局事务,它由一连串的分支事务构成,这些分支事务就是我们下面提到的本地事务。
本地事务
在一个单体架构中,对于下单场景,假设有库存订单和账号三个模块,三个模块都用一个数据源,所有事务也有这个本地事务管理。如图所示:
在微服务中情况变得复杂
三个模块变成三个service,每个service有自己专门的数据源。每个本地事务都只能保证各自模块的数据一致性,那么整体的一致性该怎么解决?
分布式事务的三个角色
- TC 事务协调器,它是事务的协调者(这里指的是 Seata 服务器),主要负责维护全局事务和分支事务的状态,驱动全局事务提交或回滚。
- TM 事务管理器,它是事务的发起者,负责定义全局事务的范围,并根据 TC 维护的全局事务和分支事务状态,做出开始事务、提交事务、回滚事务的决议。
- RM 资源管理器,它是资源的管理者(这里可以将其理解为各服务使用的数据库)。它负责管理分支事务上的资源,向 TC 注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚。
seata 简介
seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。seata 继承了分布式事务中的核心思想,它也有TC,TM,RM 三种角色。附上seata源码和官方文档:链接
seata 生命周期
- TM asks TC to begin a new global transaction. TC generates an XID representing the global transaction.TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID
- XID is propagated through microservices’ invoke chain.XID 在微服务调用链路的上下文中传播。
- RM registers local transaction as a branch of the corresponding global transaction of XID to TC.RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
- TM asks TC for committing or rollbacking the corresponding global transaction of XID.TM 向 TC 发起针对 XID 的全局提交或回滚决议。
- TC drives all branch transactions under the corresponding global transaction of XID to finish branch committing or rollbacking.TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
seata 四种事务模式–待续
- XA
- AT
- TCC
- SAGA